我正在使用此代码来验证我正在测试的方法的行为:
_repository.Expect(f => f.FindAll(t => t.STATUS_CD == "A"))
.Returns(new List<JSOFile>())
.AtMostOnce()
.Verifiable();
_repository定义为:
private Mock<IRepository<JSOFile>> _repository;
当我的测试运行时,我得到了这个例外:
表达式t =&gt; (t.STATUS_CD =“A”)不受支持。
如果我不能将表达式传递给Expect方法,有人可以告诉我如何测试这种行为吗?
谢谢!
答案 0 :(得分:2)
这有点像骗子。我对表达式执行.ToString()并比较它们。这意味着你必须在被测试的类中以相同的方式编写lambda。如果您愿意,可以在此处进行一些解析
[Test]
public void MoqTests()
{
var mockedRepo = new Mock<IRepository<Meeting>>();
mockedRepo.Setup(r => r.FindWhere(MatchLambda<Meeting>(m => m.ID == 500))).Returns(new List<Meeting>());
Assert.IsNull(mockedRepo.Object.FindWhere(m => m.ID == 400));
Assert.AreEqual(0, mockedRepo.Object.FindWhere(m => m.ID == 500).Count);
}
//I broke this out into a helper as its a bit ugly
Expression<Func<Meeting, bool>> MatchLambda<T>(Expression<Func<Meeting, bool>> exp)
{
return It.Is<Expression<Func<Meeting, bool>>>(e => e.ToString() == exp.ToString());
}
答案 1 :(得分:1)
浏览Moq讨论列表,我想我找到了答案:
看来我遇到了Moq框架的限制。
编辑,我找到了另一种测试表达式的方法:
http://blog.stevehorn.cc/2008/11/testing-expressions-with-moq.html
答案 2 :(得分:0)
在Rhino Mocks中你会做这样的事情......
使用Stub并忽略参数,而不是使用Expect。然后有 -
Func<JSOFile, bool> _myDelegate;
_repository.Stub(f => FindAll(null)).IgnoreArguments()
.Do( (Func<Func<JSOFile, bool>, IEnumerable<JSOFile>>) (del => { _myDelegate = del; return new List<JSOFile>();});
致电真实代码
*设置假的JSOFile对象,STATUS_CD设置为“A”*
Assert.IsTrue(_myDelegate.Invoke(fakeJSO));
答案 3 :(得分:0)
试试这个
_repository.Expect(f => f.FindAll(It.Is<SomeType>(t => t.STATUS_CD == "A")))
检查错误的一种简单方法是确保在期望通话结束时您总是有三个')。
答案 4 :(得分:0)
如果你想测试传递正确的参数,你总是可以“滥用”return语句:
bool correctParamters = true;
_repository.Expect(f =&gt; f.FindAll(It.IsAny&gt;()))
.Returns((Func func)=&gt; {correctParamters = func(fakeJSOFile);返回新的List-JSOFile-();})
.AtMostOnce()
.Verifiable();
Assert.IsTrue(correctParamters);
这将使用您想要的参数调用传入的函数。