【发布时间】:2010-10-27 00:32:27
【问题描述】:
我对 Mocking 很陌生。在下面的示例中,我正在使用 Moq 并尝试创建一个 _companyRepository。然而,第二个测试有一个空参考。即公司没有被实例化。
Assert.AreEqual(viewModel.Company.Name, "MyCompany");
认为我在这里遗漏了一些愚蠢的东西。
[TestClass]
public class ErrorControllerTest
{
private Mock<ICompanyRepository> _companyRepository;
public ErrorController CreateErrorController()
{
_companyRepository = new Mock<ICompanyRepository>();
_companyRepository.Setup(c => c.Get(2)).Returns(new Company {Name = "MyCompany"});
return new ErrorController(_companyRepository.Object);
}
[TestMethod]
public void Test()
{
var controller = CreateErrorController();
controller.Test(""); // action is called
var viewModel = (ErrorViewModel)controller.ViewData.Model;
Assert.IsInstanceOfType(controller.ViewData.Model, typeof(ErrorViewModel));
Assert.AreEqual(viewModel.Company.Name, "MyCompany");
}
}
控制器
public class ErrorController : Controller
{
private readonly ICompanyRepository _companyRepository;
public ErrorController(ICompanyRepository companyRepository)
{
_companyRepository = companyRepository;
}
public ActionResult Test()
{
var company = _companyRepository.Get(2);
var viewModel = new ErrorViewModel
{
Company = company
};
return View(viewModel);
}
}
【问题讨论】:
-
写下控制器动作。
-
嗯...我看不出有什么问题。你可以试试
.Setup(c => c.Get(It.IsAny<int>()))。当您调试测试并逐步执行代码并在您的操作中到达_companyRepository.Get(2)- 返回null? Ps,您的第一个断言毫无价值,因为如果它不是ErrorViewModel类型,则上面一行的强制转换会引发异常。请改用var viewModel = controller.ViewData.Model as ErrorViewModel;。
标签: asp.net-mvc-2 moq