Тестирование макетов объектов носорога - PullRequest
2 голосов
/ 22 января 2012

Я новичок в RhinoMocks, и я пытаюсь написать тест, как показано У меня есть такие классы

public class A
{
    public void methodA(){}
}
public class B
{
    public void methodB(A a)
    {
      a.methodA();
    }
}

И я пытаюсь проверить это так

A a = MockRepository.GenerateMock<A>();
public void ShouldTest()
{
    B b = new B();
    b.methodB(a);
    a.AssertWasCalled(x=>x.methodA());
    a.VerifyAllExpectations();
}

Но выдает ошибку, как показано: System.InvalidOperationException: ожидания не были настроены для проверки, убедитесь, что вызов метода в действии является вызовом метода виртуального (C #) / переопределяемого (VB.Net).

Как мне тогда проверить методB? Может кто-нибудь помочь ??

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Rhino mock создает прокси-класс при вызове метода MockRepository.Generate ***. Это означает, что он расширяет вашего типа. Если вы не объявляете какую-либо абстракцию, вы не можете делать никаких выводов, которые необходимы в любой фальшивой структуре.

Вы можете сделать две вещи

  1. Создание интерфейса (лучший дизайн)
  2. Сделать члена виртуальным (это позволит RhinoMocks наследоваться от вашего типа и создать прокси для виртуального члена

Пример кода

public interface IA { void methodA();}
public class A:IA{public void methodA() { }}
public class B
{
    public void methodB(IA a)
    {
        a.methodA();
    }
}

[TestFixture]
public class Bar
{
    [Test]
    public void BarTest()
    {
        //Arrange
        var repo = MockRepository.GenerateMock<IA>();

        //Act
        B b = new B();
        b.methodB(repo);

        //Assert
        repo.AssertWasCalled(a => a.methodA());
        repo.VerifyAllExpectations();
    }
}
1 голос
/ 22 января 2012

У вас есть конкретные классы без виртуальных методов и интерфейсов.Вы ничего не можете издеваться.

Обновление:

Вот один из способов сделать это:

public interface IA
{
    void methodA();
}

public class A : IA
{
    public void methodA(){}
}
public class B
{
    public void methodB(IA a)
    {
      a.methodA();
    }
}

Затем используйте

IA a = MockRepository.GenerateMock<IA>();
...