2008-12-15 61 views
4

我已经搜索了这个,它似乎是一个赶上所有,不幸的是,我读过的一切都无助于弄清楚。这里是类:犀牛嘲笑异常期望#1当前#0:需要帮助

public interface IMockInterface 
{ 
    MockClass MockedMethod(); 
    MockClass MockThis(); 
} 

public class MockClass : IMockInterface 
{ 
    public virtual MockClass MockedMethod() 
    { 
    MockClass returnValue; 

    returnValue = new MockClass(); 
    returnValue.SomeMessage = "Not mocked"; 
    return returnValue; 
    } 

    public MockClass MockThis() 
    { 
    MockClass mock; 
    MockClass returnValue; 

    mock = new MockClass(); 

    return mock.MockedMethod(); 
    } 
} 

而且测试:

public void MockTest_Internal() 
{ 
    MockClass mainClass; 
    MockClass returnedClass; 
    IMockInterface mockProvider; 

    mainClass = new MockClass(); 

    mockProvider = repository.StrictMock<IMockInterface>(); 
    Expect.Call(mockProvider.MockedMethod()) 
    .Return(new MockClass { SomeMessage = "Mocked" }); 
    repository.ReplayAll(); 

    returnedClass = mainClass.MockThis(); 
    provider.AssertWasCalled(item => item.MockedMethod()); 

    Assert.IsTrue(returnedClass.SomeMessage == "Mocked"); 
} 

,也有试过和不工作

但我不断收到此异常:

犀牛.Mocks.Exceptions.ExpectationViolationException:
IMockInterface.MockedMethod();预期#1,实际#0

现在从我读过的这将建议要么调用方法不同于预期的参数或该方法从未调用,但预计会被调用。这不是测试的情况。

边注意:这是我第一次真正使用Rhino.Mocks而没有使用一些内部代码,所以我基本上都是在随身携带时才选择它。有可能是一些非常愚蠢的在这里...

这是旧的测试评论,但不是我应该一直使用:

public void MockTest_Internal() 
{ 
    MockClass mainClass; 
    MockClass returnedClass; 
    IMockInterface mockProvider; 

    mainClass = new MockClass(); 

    var provider = MockRepository.GenerateStub<IMockInterface>(); 
    provider.Stub(item => item.MockedMethod()) 
    .Return(new MockClass { SomeMessage = "Mocked" }); 

    returnedClass = mainClass.MockThis(); 
    provider.AssertWasCalled(item => item.MockedMethod()); 

    Assert.IsTrue(returnedClass.SomeMessage == "Mocked"); 
} 

回答

3

你告诉模拟框架存根提供者对象上的MockedMethod类,但是绝不会将提供者注入要使用的mainClass对象中。我不清楚你想要完成什么,但是如果你想要调用模拟方法,那么必须在存根被设置的对象上调用它。

如果你定义了如下的MockThis,我想你会发现它会起作用。

public MockClass MockThis(IMockInterface provider) 
{ 
    return provider.MockMethod(); 
} 

底线是你得到的异常,因为方法从来没有在提供者上调用,只在mainClass对象上。

编辑:例

public class ClassUnderTest 
{ 
    private ProviderClass provider { get; set; } 

    public ClassUnderTest(ProviderClass provider) 
    { 
     this.Provider = provider; 
    } 

    public int DoOperation() 
    { 
     return this.Provider.ProviderOperation(); 
    } 
} 

public class ProviderClass 
{ 
    private int value = 42; 
    public ProviderClass() 
    { 
    } 

    public virtual int ProviderOperation() 
    { 
     return this.value; 
    } 
} 


[TestMethod] 
public void DoOperationTest() 
{ 
    ProviderClass mockProvider = MockRepository.GenerateMock<ProviderClass>(); 
    mockProvider.Expect(mp => mp.ProviderOperation()).Return(-1); 

    ClassUnderTest target = new ClassUnderTest(mockProvider); 

    int expectedValue = -1; 
    int value = target.DoOperation(); 

    Assert.AreEqual(expectedValue, value); 

    mockProvider.VerifyAllExpectations(); 
} 

通常情况下,ProviderClass对象将从ProviderOperation方法返回42,但我们嘲笑它,并告诉它返回-1。当调用ClassUnderTest DoOperation方法时,调用模拟提供者对象的ProviderOperation方法并返回模拟值-1。

希望这会有所帮助。

+0

我只是想创建一个垃圾类来学习如何模拟。基本上,我创建了一个类,以便在方法中调用方法并返回一些内容。 – 2008-12-15 22:01:14