【发布时间】:2013-03-01 22:35:05
【问题描述】:
我的仓库界面有以下方法:
IQueryable<T> GetQuery<T>(Expression<Func<T, bool>> predicate) where T : class;
我有一个要在单元测试中使用以下构造函数的类:
public MyClass(IUnitOfWork unitOfWork)
在IUnitOfWork 接口上有一个暴露的存储库属性:
Repository Repository { get; }
所以我尝试像这样对MyClass.DoSomething() 方法进行单元测试:
[TestInitialize]
public void Setup()
{
accounts = new List<Account>()
{
new Account()
{
Id = 123
}
};
}
接下来我的单元测试Arrange 部分失败了:
//Arrange
var repositoryMock = new Mock<IUnitOfWork>();
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123))
.Returns(accounts.AsQueryable()); //This setup always fails
var myClass = new MyClass(repositoryMock.Object); //don't even get here
我得到的例外是:
System.NotSupportedException:非虚拟机上的设置无效 (在 VB 中可重写)成员:x => x.Repository.GetQuery(y => y.Id == 123)
我在模拟中尝试了Setup 的其他变体:
repositoryMock.Setup(x => x.Repository.GetQuery<Account>()).Returns((Account a) => accounts.AsQueryable().Where(z => z.Id == 123));
和
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123)).Returns((Account a) => accounts.AsQueryable().Where(z => z == a));
但没有成功;我每次都得到相同的异常。当我运行单元测试时,它们总是抛出相同的异常。由于我使用的是要模拟的接口,为什么会出现此异常以及如何正确执行此操作?谢谢!
【问题讨论】: