2011-08-29 68 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);