c# - 用于对我无法轻松创建的返回类型进行单元测试的选项

标签 c# unit-testing moq

我需要对一个方法进行单元测试,该方法返回一个我无法轻易伪造或实例化的类型。该类型实现 IQueryable<T>我最初认为我可以利用它来发挥自己的优势,但目前我不知道如何利用。

例如:

public sealed class MyTrickyClass<T> : IQueryable<T>
{
    ...
}

public MyTrickyClass<T> GetData()
{
    return repository.GetAllData();
}

和我的单元测试

[Test Method]
public void CanGetData()
{
    var data = (new List<Record>() { new Record() }).AsQueryable();
    var mockRepository = new Mock<IRepository<Record>>();
    mockRepository.Setup(s => s.GetAllData()).Returns(data);

    MyService service = new MyService(mockRepository.Object);
    var result = service.GetData();

    Assert.IsNotNull(result);

}

这不会编译,因为 GetAllData() 的返回类型是 MyTrickyClass<T> 。如果我尝试转换 dataMyTrickyClass<Record>类型,转换失败。

所有这些都有道理,但它让我想知道正确的解决方案是什么。对于这种情况有哪些解决方法?我也许能够更改 MyTrickyClass,但理想情况下我希望找到一个不影响它的解决方案。

最佳答案

你可以有MyTrickyClass<T>实现接口(interface)ITrickyClass<T> ,继承自 IQueryable<T> 。这对你的类本身来说似乎是微乎其微的,而且你有一个很好的 mock 接缝。

关于c# - 用于对我无法轻松创建的返回类型进行单元测试的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548538/

相关文章:

c# - 对集合使用 CollectionAssert.Contains

javascript - 使用 QUnit/Sinon 测试 window.onerror

javascript - 使用 RhinoMock 或 Moq 测试方法的内部结构

c# - Moq 检查是否使用另一个调用的参数调用方法

c# - 将单词(字符串)转换为 Int

c# - 获取当前 Activity - Xamarin Android

.NET MVC 5 中的 Javascript 对象绑定(bind)和服务器端验证

c# - WP7 应用程序测试中的单元测试日志

c# - 对 SqlCommand 的扩展方法进行单元测试的方法

c# - MVC 5 翻译 IdentityResult