我正在使用.net 4和C#,EntityFramework 4和Moq 4.我正在尝试模拟我的UnitOfWork,一个Repository,最后是一个方法调用。
以下是我遇到问题的代码
var unitOfWorkMock = new Mock<UnitOfWork>();
var cFieldRepositoryMock = new Mock<IRepository<CField>>();
System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID;
cFieldRepositoryMock.Setup(x => x.GetFirst(query));
GetFirst的方法签名:
T GetFirst(Expression<Func<T, bool>> query = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null);
CField:
public class CField
{
public CField()
{
//do stuff
}
public int ID { get; set; }
public int FID { get; set; }
public int CID { get; set; }
}
我期待发生的事情: 我期待的是,当我调用我的cFieldRepositoryMock的GetFirst方法时,它将匹配我传入的lambda表达式与我在Setup中定义的表达式。
发生了什么: 我在安装程序分配上遇到编译器错误:“表达式树可能不包含使用可选参数的调用或调用”
我显然做错了什么,我只是不确定是什么。任何建议都表示赞赏,我对单元测试还不熟悉。
谢谢! AFrieze
答案 0 :(得分:8)
您收到的错误实际上似乎是limitation of expressions:
要对这样的东西进行单元测试,请考虑使用It.IsAny(正如Carsten已经建议的那样):
cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));