我已经对此进行了搜索,这似乎是一个全部,但不幸的是,我读过的所有内容都无法解决这个问题。这是班级:
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");
}
并且也尝试过并且不起作用
但我一直得到这个例外:
Rhino.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");
}
您告诉模拟框架在提供者对象上存根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。
希望这可以帮助。
当使用我在测试中构建的对象参数调用存根方法时,我通常会遇到此错误,而在测试代码中,在调用该方法之前构建对象。解决方案是使用Rhino.Mocks Matches()
。
例如:
Arg<string>.Matches(s => s.Contains("some substring"))