1
[HttpPost] 
public ActionResult Create(Car car) 
{ 
    _repository.CreateCar(car); 
    _repository.UpdateRegistrationDetails(car); 
} 

什麼,我想要做的就是寫單元測試,以確保Create電話CreateCarUpdateRegistrationDetails。這些方法會發生什麼並不重要,只是他們會被調用。有人可以告訴我如何做到這一點?我是否需要爲此使用模擬框架?我安裝了RhinoMocks來使用。你在RhinoMocks中使用Expect嗎?單元測試確保一個方法調用另一個方法

回答

4

再次使用起訂量,我認爲你需要模擬倉庫,而不是(這裏假設名字當然)

var mock = new Mock<IRepository>(); 

var controller = new Controller(mock.Object); //assuming this is how you create it 

var car = new Car(); 
controller.Create(car); 

mock.Verify(x => x.CreateCar(car)); 
mock.Verify(x => x.UpdateRegistrationDetails(car)); 

無需SetupExpect作爲嘲笑的方法不返回任何

[編輯] 這裏是一個Rhino.Mocks例如

var mock = MockRepository.GenerateStub<IRepository>(); 

var controller = new Controller(mock); //assuming this is how you create it 

var car = new Car(); 
controller.Create(car); 

mock.AssertWasCalled(x => x.CreateCar(car)); 
mock.AssertWasCalled(x => x.UpdateRegistrationDetails(car)); 
+0

還要確保'_repository'是一個接口或者兩個方法都是虛擬的 –

1

最好的答案是用嘲弄的框架行吟詩人rs在這裏提到。骯髒的方式,但有時更快,如果你不想學習嘲笑框架(你真的應該)是創建一個測試類和重寫虛擬方法。你的情況是這樣

public class RepoUnderTest : Repo 
{ 
    public bool UpdateRegistrationDetailsCalled = false; 
    public override void UpdateRegistrationDetails(Car car) 
    { 
     base.UpdateRegistrationDetails(car); 
     UpdateRegistrationDetailsCalled = true; 
    } 
} 

,那麼你可以測試類似的東西來

[HttpPost] 
public ActionResult Create(Car car) 
{ 
    // Arrange 
    var _repository = new RepoUnderTest(); 

    // Act 
    _repository.CreateCar(car); 

    // Assert 
    Assert.IsTrue(_repository.UpdateRegistrationDetailsCalled); 
} 

再次嘲弄的框架是最好的。我會爲這些投票,但有時這是一個簡單的介紹,以測試這些事情之前,你越來越嘲笑。

1

關於在RhinoMocks中使用Expect()。我主張儘可能使用存根和'Stub()'或AssertWasCalled()方法。 Expect()用於沒有其他工作的情況。

相關問題