如何在使用Rhino Mocks时在MVC3中模拟模型

时间:2011-08-29 20:19:25

标签: asp.net-mvc-3 mocking rhino-mocks

我是Rhino Mocks的新手。我有几个型号。其中一个如下。我想用Rhino Mocks。我下载了最新的Rhino.Mocks.dll并将其添加到我的testharness项目中。如何模拟我的模型对象? 我想创建一个单独的项目来模拟我的模型对象。有人可以指导这个程序吗?

public class BuildRegionModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public List<SelectListItem> StatusList { get; set; }
    public string Status { get; set; }
    public string ModifyUser { get; set; }
    public DateTime ModifyDate { get; set; }
}

2 个答案:

答案 0 :(得分:5)

不应该嘲笑像这样的模型。通常它们通过控制器操作传递给视图,控制器操作将它们作为操作参数传递。你模拟服务,存储库访问,......

例如,如果您要测试以下控制器:

public class HomeController: Controller
{
    private readonly IRegionRepository _repository;
    public HomeController(IRegionRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Show(int id)
    {
        BuildRegionModel model = _repository.GetRegion(id);
        return View(model);
    }
}

您可以在单元测试中模拟_repository.GetRegion(id)来电。像这样:

// arrange
var regionRepositoryStub = MockRepository.GenerateStub<IRegionRepository>();
var sut = new HomeController(regionRepositoryStub);
var id = 5;
var buildRegion = new BuildRegionModel
{
    Name = "some name",
    Description = "some description",
    ...
}
regionRepositoryStub.Stub(x => x.GetRegion(id)).Return(buildRegion);

// act
var actual = sut.Show(id);

// assert
var viewResult = actual as ViewResult;
Assert.IsNotNull(viewResult);
Assert.AreEqual(viewResult.Model, buildRegion);

或用于将视图模型作为参数的POST控制器操作:

[HttpPost]
public ActionResult Foo(BuildRegion model)
{
    ...
}

在你的单元测试中,你只需准备并实例化一些你将传递给行动的BuildRegion

答案 1 :(得分:0)

您无需模拟模型,只需直接使用它们。

var returnObject = new BuildRegionModel();

mockedObject.Stub(x => x.Method()).Return(returnObject);