Rhino Mocks Exception Expect # 1 Actual # 0: Нужна помощь - PullRequest
4 голосов
/ 16 декабря 2008

Я искал это, и это, кажется, ловушка для всех, к сожалению, все, что я прочитал, не помогает понять это. Вот этот класс:

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

Ответы [ 2 ]

3 голосов
/ 16 декабря 2008

Вы говорите фиктивной платформе о заглушении класса 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 будет возвращать 42 из метода ProviderOperation, но мы смоделировали его и сказали вернуть -1. Когда вызывается метод DoOperation ClassUnderTest, вызывается метод ProviderOperation объекта фиктивного провайдера, который возвращает фиктивное значение -1. ​​

Надеюсь, это поможет.

0 голосов
/ 12 марта 2019

Обычно я получаю эту ошибку, когда вызывается метод с заглушкой с аргументом объекта, который я строю в тесте, а в тестируемом коде объект создается перед вызовом этого метода. Решением является использование Rhino.Mocks Matches().

Пример:

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