2010-08-10 57 views
2

我對Rhino Mock有個疑問。關於Rhino Mock的問題(RhinoAutoMocker)

我想限制哪些方法可以從被測方法中調用。

可以說我有,我反對這樣寫單元測試的方法:

public void MyMethod() 
{ 
    var test = _Repository.Get(2); 

    _Services.DoSomething(test); 
} 

什麼我現在做的是這樣的:

[Test] 
public void TestMethod() 
{ 
    var mock1 = CreateMock<IRepository>(); 
    var mock2 = CreateMock<IServices)(); 

    mock1.Expect(x => x.Get(1).IgnoreArguments().Return(new Poo()).Repeat.Once(); 
    mock2.Expect(x => x.DoSomething(new Something()).IgnoreArguments().Repeat.Once(); 

    ClassUnderTest.MyMethod(); 

    mock1.VerifyAllExpectations(); 
    mock2.VerityAllExpectations(); 
} 

,這是好的,但什麼我想要防止有人改變這樣的方法:

public void MyMethod() 
{ 
    var test = _Repository.Get(2); 

    var test = _Repository.Save(test); 

    _Services.DoSomething(test); 
} 

正如你可以看到Repo的Save方法所謂的sitory,所以這顯然是危險的,因爲如果有人誤加了那條線我們就會遇到麻煩。

我該如何限制某人做這件事?謝謝。

回答

2

有幾個選項:

嚴格嘲笑

嚴格嘲笑拋出一個異常,如果他們被稱爲的方式,不匹配的期望。您可以創建嚴格的嘲笑這樣的:

var mocks = new MockRepository(); 
var fooStrictMock = mocks.StrictMock<IFoo>(); 

.Repeat.Never()

如果你只在防止調用只是一個特定的方法,你可以使用.Repeat.Never()量詞上的期望感興趣像這樣:

mock1.Expect(x => x.Save(null)).IgnoreArguments().Repeat.Never(); 

AssertWasNotCalled

您可以在您的測試像這樣結束通話AssertWasNotCalled

var repositoryStub = MockRepository.GenerateStub<IRepository>(); 
repositoryStub.Stub(x => x.Get(2)).Return(...); 

var underTest = new UnderTest(repositoryStub); 
underTest.DoSomething(); 

repositoryStub.AssertWasNotCalled(x => x.Save(Arg<Thing>.Is.Anything)); 
+0

謝謝您的回答。有一個小問題。使用Repeat.Never()和AssertWasNotCalled有點慢,因爲可以說如果我有20種方法,我不想成爲那麼我不得不像上面那樣列出所有這些方法。 第一個選項看起來不錯,但我無法完全使用AutoMock來使用它。我會稍後再試。 – Raha 2010-08-12 06:54:48