使用Moq和Mock对象 - 我的列表计数总是0,不应该是

时间:2014-04-29 20:08:39

标签: c# unit-testing moq

我不确定为什么我的获取列表方法会在我的测试中返回0条记录,但是当我运行我的应用程序时,它会拉回5个项目的列表。

[TestMethod]
public void TestHasListOfSurveys()
{
    var mockRepository = new Mock<ISurveyListRepository>();
    var mockModel = new List<SurveyList>();
    string testDate = DateTime.Today.AddYears(-1).ToShortDateString();

    mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);

    var testClass = new SurveyListModel(mockRepository.Object);
    var testModel = testClass.GetSurveyList(testDate);

    mockRepository.VerifyAll();

    Assert.IsTrue(testModel.Count > 0);
}

我做错了什么?

更新

好吧,我想我现在看到了我做了什么。所以,如果我把它改为:

    var mockModel = new List<SurveyList>();
    mockModel.Add(new SurveyList { SurveyID = 1, SurveyName = "test1" });
    mockModel.Add(new SurveyList { SurveyID = 2, SurveyName = "test2" });
    mockModel.Add(new SurveyList { SurveyID = 3, SurveyName = "test3" });

然后它将有一个计数并且没有问题然后我的模拟对象有项目。

2 个答案:

答案 0 :(得分:2)

在您的测试中,

ISurveyListRepository依赖项被替换为mock,您的应用程序可能会使用其他实现。

var mockModel = new List<SurveyList>();
mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);

这些行使模拟返回一个空列表,这可能是您的测试失败的原因。如果您将一些项添加到列表中,您的测试将通过。另一方面,应用程序使用实现ISurveyListRepository的类。找到那个课程,你就会明白为什么它会返回5个项目。

答案 1 :(得分:1)

而不是:

mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);

你应该写一些类似的东西:

mockRepository.Setup(x => x.GetSurveyList(It.IsAny<String>)).Returns(mockModel);

否则,您的模拟将不会被使用。

无论如何,如果你告诉它返回空的mockModel,你会得到一个空列表。