(我不确定它是否重要,但我使用的是C#与.NET framework 4.0并使用Microsoft的内置测试框架)
首先,是否值得测试非常简单的代码块?例如,对于我的一个类,我有一个Fill方法,它接受10个参数,并根据这些参数设置类中10个属性的值.填充代码实际上只是一系列值设置语句.我已经读过一个好的单元测试应该只断言一件事,但在我看来,为了检查所有这些值是否已正确设置,我必须断言10件事.所以要么我根本不能测试它,相信代码很简单,或者写10个不同的单元测试来检查每个属性.这些都是正确的吗?
第二个例子.我有一个代码块,可以调用一个类的私有方法,最后调用一个Web服务来向用户发送一封电子邮件.我知道我应该为电子邮件服务注入一个模拟Web服务,这样我就不会测试多个类,但是我应该如何测试所有这些私有方法和那个电子邮件调用?
第三个例子与上一个例子类似.我的班级结构看起来像:
控制器—取决于—> IWidget(一些业务对象)&& IDataProvider
DataProvider(实现IDataProvider)—取决于—>网络服务
WebService —直接拨打电话—>数据库
现在我有控制器的单元测试(注入模拟Widgets和DataProviders).
这一切都很好.我也有Widget的单元测试没有问题.
问题归结于DataProvider和WebService.此特定实例中的WebService除了通过数据提供者的请求并传回数据(由于物理体系结构限制)之外什么都不做.
我无法对DataProvider进行单元测试,因为我不确定如何注入模拟Web服务.我也不确定单元测试DataProvider是否值得,因为我最终只需要编写很多模拟数据集来测试值.同样,我不确定如何对Web服务进行单元测试,因为在这种情况下,WebService的主要功能取决于数据库.再一次,这值得测试吗?如果WebService做了更多,除了仅作为传递但仍依赖于数据库,该怎么办?
我非常感谢任何人在这方面可以提出的任何建议.非常感谢.
I’ve read that a good unit test is supposed to only assert one thing, but it seems to me in order to check that all those values have been set correctly I would have to assert 10 things. So either I can not test it at all, trusting that the code is simple enough, or write 10 different unit tests to check each property.
我会说一个好的单元测试应该测试一个故事或用例场景,这确实可能涉及多个断言.
如果该方法涉及10个赋值,则确实有可能混淆了一些,名称拼写错误等,因此单元测试为其(小)价格提供了价值.
I have a block of code that makes several calls to a class’s private methods and finally calls a web service to fire off an email to a user. I understand that I should inject a mock web service for the email service so that I’m not testing multiple classes, but how should I test that all those private methods and that email call have been made?
这称为感应,即感知您所做呼叫的结果/副作用.答案取决于那些私有方法实际上做了什么.如果他们汇总了一些最终进入邮件消息的数据,则可以通过消息内容对其进行测试.如果他们以可从外部检测到的方式更改对象的内部状态,则可以对其进行验证.如果这些都不成立,甚至可能会将这些私有方法更好地移动到单独的类公共接口中,在那里它们可以进行适当的单元测试.
I have trouble unit testing the DataProvider because I’m not sure how to go about injecting a mock web service. I’m also unsure if unit testing the DataProvider is worth while, because I’d wind up having to code in a lot of mocked up datasets just to test values.
我不一定要对这些类进行单元测试,这些类实际上是外部组件的包装器.如果那里只有绝对最小的逻辑量,即所有(或最可能的)值得测试的代码被移出到其他单元可测试的类,IMO可以将这些类的测试留给集成/功能测试,它运行连接到真实数据库,Web服务等的整个(子)系统.