我需要对一个方法进行单元测试,该方法返回一个我无法轻易伪造或实例化的类型。该类型实现 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>
。如果我尝试转换 data
到 MyTrickyClass<Record>
类型,转换失败。
所有这些都有道理,但它让我想知道正确的解决方案是什么。对于这种情况有哪些解决方法?我也许能够更改 MyTrickyClass,但理想情况下我希望找到一个不影响它的解决方案。
最佳答案
你可以有MyTrickyClass<T>
实现接口(interface)ITrickyClass<T>
,继承自 IQueryable<T>
。这对你的类本身来说似乎是微乎其微的,而且你有一个很好的 mock 接缝。
关于c# - 用于对我无法轻松创建的返回类型进行单元测试的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548538/