2

我对单元测试和整个 ASP.NET MVC 比较陌生,我正在尝试针对一个简单的控制器操作和一个使用Moq.

ISubmissionRepository.cs

public interface ISubmissionRepository
{
    IList<Submission> GetRecent(int limit = 10);
}

HomeController.cs:

/* Injected using Unit DIC */
public HomeController(ISubmissionRepository submissionRepository)
{
    _submissionRepo = submissionRepository;
}

public ActionResult Index()
{

    var latestList = _submissionRepo.GetRecent();
    var viewModel = new IndexViewModel {
        NumberOfSubmissions = latestList.Count(),
        LatestSubmissions = latestList
    };
    return View(viewModel);
}

下面是我正在编写的单元测试,但是我的模拟存储库调用似乎没有返回任何内容,我不知道为什么。我是否正确地模拟了我的存储库调用?

HomeControllerTest.cs

[Test]
public void Index()
{
    IList<Submission> submissions = new List<Submission>
    {
        new Submission {Credit = "John Doe", Description = "Hello world", ID = 1, Title = "Example Post"},
        new Submission {Credit = "John Doe", Description = "Hello world", ID = 2, Title = "Example Post"}
    };

    Mock<ISubmissionRepository> mockRepo = new Mock<ISubmissionRepository>();
    mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions);

    /* 
    * This appears to return null when a breakpoint is set
    var obj = mockRepo.Object;
    IList<Submission> temp = obj.GetRecent(2);
    */

    controller = new HomeController(mockRepo.Object);
    ViewResult result = controller.Index() as ViewResult;

    Assert.NotNull(result);
    Assert.IsInstanceOf<IndexViewModel>(result);

}
4

2 回答 2

2

这条线

 mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions);

告诉 moq 在使用参数 2 调用集合时返回集合。您的控制器将其称为

var latestList = _submissionRepo.GetRecent();

这些是 Moq 中的单独设置,因此不会返回您的结果。您可以在测试中删除 2 或让您的控制器用 2 调用它以获得返回。

编辑 - 更新答案

尝试将您的模型设置为:

mockRepo.Setup(x => x.GetRecent(It.Is<int>(i => i == 2))).Returns(submissions);

这告诉它只有在参数列表中看到 2 时才返回。您的控制器还需要使用 2 调用它才能恢复工作。

否则,将其设置为与参数无关

mockRepo.Setup(x => x.GetRecent(It.IsAny<int>())).Returns(submissions);
于 2013-05-09T16:06:38.513 回答
1

那么在您的控制器中,您正在调用:

var latestList = _submissionRepo.GetRecent();

您的模拟设置为GetRecent(2).

将您的模拟设置修改为:

mockRepo.Setup(x => x.GetRecent()).Returns(submissions);

编辑

你的断言也应该是:

Assert.IsInstanceOf<IndexViewModel>(result.Model);
于 2013-05-13T08:18:51.827 回答