gpt4 book ai didi

c# - Rhino 模拟异常 Expect #1 Actual #0 : Need assistance

转载 作者:行者123 更新时间:2023-11-30 12:19:11 25 4
gpt4 key购买 nike

我已经搜索过这个,它似乎是一个包罗万象的东西,不幸的是我读过的所有内容都没有帮助解决这个问题。这是类(class):

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 类 stub 到提供者对象上,但您从未将提供者注入(inject)到要使用的 mainClass 对象中。我不清楚您要完成什么,但如果您希望调用模拟方法,则必须在设置 stub 的对象上调用它。

如果您如下定义 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。

希望这对您有所帮助。

关于c# - Rhino 模拟异常 Expect #1 Actual #0 : Need assistance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/369777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com