4

我已经对此进行了搜索,这似乎是一个包罗万象的内容,不幸的是,我读过的所有内容都无济于事。这是课程:

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");
}
4

2 回答 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。

希望这可以帮助。

于 2008-12-15T21:55:53.183 回答
0

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

前任:

Arg<string>.Matches(s => s.Contains("some substring"))
于 2019-03-12T14:03:02.183 回答