【发布时间】:2016-09-23 04:15:54
【问题描述】:
我正在尝试设置一个单元测试初始化程序(在 Moq 中),其中正在模拟接口方法:
public interface IRepository
{
Task<IEnumerable<myCustomObject>> GetSomethingAsync(string someStringParam);
}
...
[TestInitialize]
public void Initialize()
{
var repoMock = new Mock<IRepository>();
var objectsList = new List<myCustomObject>() {
new myCustomObject("Something"),
new myCustomObject("Otherthing")
}
repoMock.Setup<Task<IEnumerable<myCustomObject>>>(
rep => rep.GetSomethingAsync("ThisParam")
).Returns(Task.FromResult(objectsList)); //error here
}
我遇到的问题是我不知道如何获得返回我的objectsList 的方法。在实践中,这当然可以正常工作,因为 List 实现了 IEnumerable,但是在 Moq 中包装在任务中时它似乎不起作用。我得到的错误是在Returns() 方法上:
Argument 1: cannot convert from 'System.Threading.Tasks.Task<
System.Collections.Generic.List<myCustomObject>>'
to 'System.Threading.Tasks.Task<
System.Collections.Generic.IEnumerable<myCustomObject>>'
作为一种解决方法,我可以创建另一个方法来简单地创建 List<myObj> 并将其返回为 IEnumerable<myObj>,但我觉得必须有另一种更简洁的方法来处理这个问题。
那么,我如何在不创建辅助方法的情况下做到这一点?
【问题讨论】:
-
如果不使用
var而使用IEnumerable<myCustomObject> objectsList = new List<myCustomObject>()会怎样? -
仅仅因为
A和B这两种类型表现出特定的继承/实现关系,那不是否意味着G<A>和G<B>表现出相同的关系。
标签: c# unit-testing moq