Moq期望IRepository传递表达

时间:2008-11-13 21:34:00

标签: unit-testing moq

我正在使用此代码来验证我正在测试的方法的行为:

    _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方法,有人可以告诉我如何测试这种行为吗?

谢谢!

5 个答案:

答案 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 Discussion

看来我遇到了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);

这将使用您想要的参数调用传入的函数。