犀牛模拟异常期待#1实际#0:需要帮助

问题描述 投票:4回答:2

我已经对此进行了搜索,这似乎是一个全部,但不幸的是,我读过的所有内容都无法解决这个问题。这是班级:

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");
}
c# exception rhino-mocks
2个回答
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
投票

当使用我在测试中构建的对象参数调用存根方法时,我通常会遇到此错误,而在测试代码中,在调用该方法之前构建对象。解决方案是使用Rhino.Mocks Matches()

例如:

Arg<string>.Matches(s => s.Contains("some substring"))
© www.soinside.com 2019 - 2024. All rights reserved.