【问题标题】:Mocking a list of objects模拟对象列表
【发布时间】:2013-04-02 15:36:31
【问题描述】:

我正在学习如何编写单元测试,并且有点坚持使用 Mocks。我正在使用 Moq 进行模拟。我正在使用 VS 2012 附带的内置测试框架。如果这样更好(并且可以解决我的问题),我可以切换到 NUnit。我有一个工作模式设置单元。我正在测试的方法是重置用户密码。我告诉 Moq 根据我正在测试的方法中调用的唯一代码返回用户列表:

var mock = new Mock<IUnitOfWork>();
        mock.Setup(u => u.UserRepository.Get(t => t.PassResetCode.Equals("test1"), null, "")).Returns(
            new List<User>
        {
            new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "test4@test.com", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },                
        });

在我正在测试的方法中,它调用以下内容:

var users = unitOfWork.UserRepository.Get(u => u.PassResetCode.Equals(code));

据我所知,它没有返回我在此处的测试中创建的用户列表。我是否也需要模拟工作单元类中的存储库?或者只是模拟工作单元界面就足够了?如果有帮助,我可以发布更多代码。

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    您的存储库接受委托,并且您正在设置期望特定委托t =&gt; t.PassResetCode.Equals("test1")。我认为 mock inside 会将传递的谓词与这个委托进行比较。不同的委托实例不会以 99.99% 的概率匹配。您应该避免在这个特定的期望中为谓词设置特定的约束,而是使用It.IsAny&lt;&gt;()

    var mock = new Mock<IUnitOfWork>();
    mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...)
    

    【讨论】:

    • 我仍然不太确定在这种情况下如何使用It.IsAny&lt;&gt;()。输入您拥有的内容似乎无法编译。您可以在示例中添加更多内容,还是需要更多我的代码才能做到这一点?感谢您的帮助!
    • @ssn771,对不起,有一个答案。在It.IsAny&lt;T&gt; 中,T 应该是您传递给Get 方法的委托的类型。
    • 它似乎还在抱怨。这是错误消息:Argument 1: cannot convert from 'System.Func&lt;RunnersTrackerDB.User,bool&gt;' to 'System.Linq.Expressions.Expression&lt;System.Func&lt;RunnersTrackerDB.User,bool&gt;&gt; Get 方法的方法签名是:public virtual IEnumerable&lt;TEntity&gt; Get( Expression&lt;Func&lt;TEntity, bool&gt;&gt; filter = null, Func&lt;IQueryable&lt;TEntity&gt;, IOrderedQueryable&lt;TEntity&gt;&gt; orderBy = null, string includeProperties = "")
    • 我明白了。我需要在其中添加Expression。所以在这种情况下对我有用的最终版本是:mock.Setup(u =&gt; u.UserRepository.Get(It.IsAny&lt;Expression&lt;Func&lt;User, bool&gt;&gt;&gt;(), null, "")).Returns(...) 谢谢你的帮助!
    【解决方案2】:
    var mock = new Mock<IUnitOfWork>();
            mock.Setup(u => u.UserRepository.Get("test1", null, "")).Returns(
                new List<User>
            {
                new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "test4@test.com", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },                
            });
    

    您必须确保您传递的正是这些参数。或者,您可以将语法 It.IsAny&lt;TYPE&gt;() 用于您不关心的任何参数。或者您可以通过It.Is&lt;TYPE&gt;(condition) 来检查参数。

    【讨论】:

      【解决方案3】:

      假设您使用的是Moq,问题是 setup 方法不能像那样处理 lambdas。您需要使用It.IsAny&lt;Func&lt;T, bool&gt;&gt; () 作为您的第一个参数。

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        相关资源
        最近更新 更多