2008-12-15 3 views
4

Я искал это, и, похоже, это все поймало, к сожалению, все, что я прочитал, не помогает понять это. Вот класс:Rhino Mocks Expect 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"); 
} 

ответ

3

Вы хотите сказать, фиктивные рамки незавершенным класс MockedMethod объекта-поставщика, но вы никогда не вводите поставщика в объект mainClass, который будет использоваться. Мне непонятно, что вы пытаетесь выполнить, но если вы хотите, чтобы вызываемый метод вызывался, он должен быть вызван на объект, на котором был установлен заглушка.

Если вы определяете MockThis, как показано ниже, я думаю, вы обнаружите, что он будет работать.

public MockClass MockThis(IMockInterface provider) 
{ 
    return provider.MockMethod(); 
} 

Суть заключается в том, что вы получите исключение, потому что метод не был вызван на поставщике, только на объекте MainClass.

EDIT: Пример

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 объекта mock provider и возвращает издеваемое значение -1.

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

+0

Я просто пытаюсь создать класс мусора, чтобы узнать, как насмехаться. В основном я создал класс, чтобы иметь метод, который вызывается внутри метода и что-то возвращать. –

+0

Однако, посмеянный объект является конкретным объектом. Код, который вы тестируете, должен будет использовать обманный объект напрямую, чтобы вызываемые/издевавшиеся методы вызывались. – tvanfosson

+0

Честно говоря, я мог бы использовать второй пример, если он будет работать. Прямо сейчас я просто идиот, пытающийся поставить самолет вместе с коробкой частей. –