2011-08-29 67 views
1

我是新来的犀牛制品时嘲笑在MVC3模型。我有几个模型。其中之一如下。我想用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

你为什么要嘲笑你的模型类?你嘲笑像数据访问和服务层等东西,而不是模型类。 – WestDiscGolf

+0

不确定你正在创建的测试是什么样的,但你不需要“模拟”模型类。你应该实例化它们,因为它们只是携带你的数据。如果你是嘲讽控制器的依赖,它返回一个模型实例,那么你可以这样'dependentService.Stub(DS => ds.someProcess(0))IgnoreArguments()返回(新BuildRegionModel {名称= “someName”});'在您的测试任务部分。 –

+0

这是我的viewmodel。我将从尚未准备好的Web服务中获取值。所以我必须给它一些假数据。这就是为什么我试图嘲笑它。如果我错了,请让我以正确的方式? – TJK

回答

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,你会传递给动作。

0

你并不需要模拟你的模型,只需直接使用它们。

var returnObject = new BuildRegionModel(); 

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