.net – Moq.Mock >>() – 如何使用Moq将表达式设置为Mock

前端之家收集整理的这篇文章主要介绍了.net – Moq.Mock >>() – 如何使用Moq将表达式设置为Mock前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了很多关于这个话题的其他质量保证,我仍然找不到我的问题的解决方案,所以我决定揭露我的情况.

我有这个界面

public interface IRepository<T> where T : class,IEntity 
{
    IQueryable<T> Find(Expression<Func<T,bool>> predicate);
    T FindIncluding(int id,params Expression<Func<T,object>>[] includeProperties);
}

这是包含我想要设置的Mock的方法的基本结构

public PeopleController CreatePeopleController()
{
    var mockUnitofWork = new Mock<IUnitOfWork>();
    var mockPeopleRepository = new Mock<IRepository<Person>>();

    mockPeopleRepository.Setup(r=>r.Find().Returns(new Person(){});
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
    return new PeopleController(mockUnitofWork.Object);
}

我一直在尝试使用这种方式设置模拟器:

public PeopleController CreatePeopleController()
{
    var mockUnitofWork = new Mock<IUnitOfWork>();
    var mockPeopleRepository = new Mock<IRepository<Person>>();

    mockPeopleRepository.Setup(r=>r.Find(It.isAny<Expression<Func<Person,bool>>>()).Single()).Returns(new Person(){});
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
    return new PeopleController(mockUnitofWork.Object);
}

但系统总是抛出相同的异常“System.NotSupportedException:表达式引用一个不属于嘲笑对象的方法….”

另外我想补充说,我正在使用MSTest和Moq

我知道使用Expression设置一个Mock并不容易,不推荐,但对我来说非常重要,因为“Find”是我在应用程序中使用很多的一种方法

问题是您正在尝试将Single()扩展方法设置为嘲笑的一部分.安装调用需要具有您的方法的结果 – 而不是随后应用一些扩展方法方法的结果.我会试试这个:
[TestMethod]
    public void MyTestMethod()
    {
        var myMock = new Mock<IRepository<Person>>();
        myMock.Setup(r => r.Find(It.IsAny<Expression<Func<Person,bool>>>())).Returns(new List<Person>() { new Person() }.AsQueryable());

        Assert.IsTrue(true);
    }

在这里,您只需使用setup()方法即可使用Find()方法,并返回Returns()子句中的所有其他内容.我建议一般的方法.安装程序应该完全反映您的嘲弄项目,您可以为Returns()(或Throws()或任何)调用一些黑魔法来使其执行所需的操作.

(当我在VS中运行该代码时,它通过,所以没有抛出异常)

猜你在找的设计模式相关文章