我已经对此进行了搜索,它似乎是一个包罗万象的东西,不幸的是我读过的所有内容都无助于弄清楚它。这是课程:
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 对象上调用。
EDIT: 例子
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。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)