C# 单元测试接口和方法调用

C# 单元测试接口和方法调用,c#,unit-testing,interface,C#,Unit Testing,Interface,我不清楚有两种测试场景。两者乍一看都会产生非常脆弱的测试 首先,一个单元应该在什么时候测试接口(即验证接口是否具有设置的签名) 第二,什么时候应该“测试序列图”(我刚刚编造的一个术语)——这意味着正在验证对适当对象的调用?测试接口意味着应该只测试公共接口上可用的成员。换句话说,不要测试私人物品。将被测装置视为一个黑匣子。这使得测试更易于维护,因为您可以在不破坏测试的情况下更改实现细节。测试还将表达被测单元的用途,而不是它的实现方式 对其他对象进行的测试调用称为“交互测试”(不要与集成测试混淆,在

我不清楚有两种测试场景。两者乍一看都会产生非常脆弱的测试

首先,一个单元应该在什么时候测试接口(即验证接口是否具有设置的签名)


第二,什么时候应该“测试序列图”(我刚刚编造的一个术语)——这意味着正在验证对适当对象的调用?

测试接口意味着应该只测试公共接口上可用的成员。换句话说,不要测试私人物品。将被测装置视为一个黑匣子。这使得测试更易于维护,因为您可以在不破坏测试的情况下更改实现细节。测试还将表达被测单元的用途,而不是它的实现方式

对其他对象进行的测试调用称为“交互测试”(不要与集成测试混淆,在集成测试中,您不会模拟其他对象)。当被测单元调用另一个对象上的方法而不依赖它时,需要进行交互测试。我试着用一个例子来解释它

需要测试以下方法:

public decimal CalculateTax(Order order);
假设此方法需要调用

TaxRules TaxRuleProvider.GetRules(Country country)
返回一些本地规则。当它不调用它时,它将无法返回正确的结果。它将丢失重要信息。您不需要测试它是否被调用,只需测试结果即可

另一种方法:

public void StoreThingy(Thingy toBeStored);
它会打电话的

public void NotificationBroker.NotifyChanges(SomeChanges x);
StoreThingy不依赖于通知。您无法决定它是否发送通知。您需要通过交互测试来测试这一点


通常,交互测试的方法返回
void
。在这个类别中有各种各样的事件、通知和方法,如
Commit()

请定义“何时”(或者答案是“始终”)的含义.Language是C#,@Almad-如果答案总是,请证明这些测试带来的价值,因为它们将分别随着接口或对象模型的更改而中断。这样的中断行为是否可取?第一个答案:如果您不在乎更改行为会中断某些内容(您应该通过测试得到通知),为什么它是公共接口?第二个答案:我没有看到语言,并且误解了问题,这意味着“接口”比语言结构更广义。答案很好。我对“交互测试”不清楚,谢谢。请澄清你的第一行“你不应该测试接口是否完整”。@Ben:“如果接口完整。”“这是我对您问题的理解,即“验证接口是否具有设置的签名”。我误解了吗?@Stefan-哦,我现在明白了,我误读了这句话(出于某种原因,我在心里在“你不应该测试”之后插入了一个逗号)。进一步思考。“不要测试私有内容”-如果您遵循TDD,这是否意味着您放弃了在编写代码时开发的测试?或者TDD只是像你上面描述的那样规定测试的创建吗?@Ben:你通常不会丢弃测试。是的,TDD意味着在公共接口上编写测试。如果您觉得公共成员背后有太多的代码无法同时测试,那么应该将类划分为几个较小的类。