【问题标题】:Rhino Mocks Exception Expect #1 Actual #0 : Need assistanceRhino Mocks Exception Expect #1 Actual #0 : 需要帮助
【发布时间】:2008-12-15 21:30:42
【问题描述】:

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

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


    【解决方案1】:

    您告诉模拟框架在提供程序对象上存根 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。

    希望这会有所帮助。

    【讨论】:

    • 我只是想创建一个垃圾类来学习如何模拟。基本上我创建了一个类来拥有一个可以在方法中调用并返回一些东西的方法。
    • 被模拟的对象是一个特定的对象。您正在测试的代码需要直接使用模拟对象才能调用存根/模拟方法。
    • 老实说,如果它可行,我可以使用第二个示例。现在我只是一个想把飞机和一箱零件组装在一起的白痴孩子。
    • 好的,正如您所说,第一个测试示例很糟糕。存根不是我需要的。但是,我确实有第二个示例仍然无法正常工作。
    • 回答了一个问题,只带来了更多。
    【解决方案2】:

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

    例如:

    Arg<string>.Matches(s => s.Contains("some substring"))
    

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多