Rhino Mocks Exception Expect # 1 Actual # 0: Нужна помощь

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

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");
}
15.12.2008 21:30:42
2 ОТВЕТА
РЕШЕНИЕ

Вы говорите фиктивной платформе, чтобы заглушить класс 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.

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

3
15.12.2008 22:15:05
Я просто пытаюсь создать ненужный класс, чтобы научиться издеваться. По сути, я создал класс, чтобы иметь метод, который будет вызываться внутри метода и возвращать что-то.
Programmin Tool 15.12.2008 22:01:14
Тем не менее, высмеиваемый объект - это конкретный объект. Код, который вы тестируете, должен будет использовать макетированный объект напрямую, чтобы вызывать заглушенные / смоделированные методы.
tvanfosson 15.12.2008 22:02:39
Честно говоря, я мог бы использовать второй пример, если он будет работать. Прямо сейчас я просто идиотский ребенок, пытающийся собрать самолет вместе с коробкой деталей.
Programmin Tool 15.12.2008 22:03:45
Итак, первый тестовый пример был плох, как вы заметили. Заглушка не то, что мне было нужно. Однако у меня был второй пример, который все еще не работал.
Programmin Tool 15.12.2008 22:13:24
Ответил на один вопрос, только навел на больше.
Programmin Tool 15.12.2008 22:46:44

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

Пример:

Arg<string>.Matches(s => s.Contains("some substring"))
0
12.03.2019 14:07:59