【问题标题】:Generic unit tests for interfaces接口的通用单元测试
【发布时间】:2018-09-03 04:07:18
【问题描述】:

是否有一组单元测试可以验证我的接口实现是否正确?具体来说,我正在使用ISet<T> 的实现,并且希望基本上将其插入单元测试以验证我的实现是否正确。 (而不是我想出 5-20 个单元测试来获得良好的覆盖率)

似乎所有接口都可以为它们编写一些通用单元测试。

【问题讨论】:

  • 不确定你的意思,你应该有反映实现范围的单元测试。单元测试接口(没有实现或方法范围)如何准确工作?此外,这类问题可能不是 SO 问题,更像是软件工程问题。
  • 有些接口方法有一些逻辑/预期,但是,例如Add(T item)应该添加一个项目,可能有一个单元测试来验证它是否正确添加了一个项目,等等。
  • hmm,这听起来不像是一个好的单元测试。一个好的单元测试应该是 ISomeObjectMock.Add(T item) 被调用了 1 次或多次,当此服务方法中满足此条件时。跨度>
  • 关于泛型和类型.. 我的公司使用Fizzware 并且对于像我上面提到的概念这样的类型参数概念,您将使用It.IsAny<T>(其中T 在您的测试和期望中定义)在构建模拟服务时。有关完整示例,请参阅此 SO 答案:stackoverflow.com/a/36345351/1366179

标签: c# .net unit-testing


【解决方案1】:

Software Engineering 中有关于此事的有用帖子,代码如下所示:

private void Test<TService,TFilter>(string urlSuffix) 
    where TService : SoapHttpClientProtocol, new() 
    where TFilter : new() 
{
    string serviceUrl = Helper.GetBaseUrl() + urlSuffix;
    TService service = new TService();
    service.Credentials = Helper.GetCredentials();
    service.Url = serviceUrl;
    TFilter[] filter = { new TFilter() };
    service.ReadMultiple(filter, null, 0);
}

[TestMethod]
public void PlaceOfWork()
{
    Test<PlaceOfWork_Service,PlaceOfWork_Filter>("PlaceOfWork");
}

这是模拟服务连接和访问的通用方法,但它也可以轻松应用于接口。

但是 请注意,如果您在单元测试中使用泛型,则会失去粒度,这是因为您的测试将涵盖多种情况

  1. 很快就会变得不清楚您在每个界面中测试的内容

  2. 如果您的测试在第一次之后失败,您将无法发现更多错误,从而导致fail masking.

检查这个解决方案,稍微调整一下,以了解它的所有优点和缺点,并阅读类似的帖子。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多