Можно ли создать частичные заглушки с помощью Rhino Mocks? - PullRequest
2 голосов
/ 15 декабря 2008

Я новичок в юнит-тестировании и макете в целом и пытаюсь настроить тесты для одного из моих классов, где я хочу убедиться, что определенный метод вызывается из другого метода в том же классе. Поэтому я хотел бы использовать конкретную реализацию, но макетировать ее части. Возможно ли это?

public class MyClass
{
  public Accounts[] GetAccounts()
  {
      return GetAccounts(null);
  }

  public Accounts[] GetAccounts(CustomerId id)
  {
      if(id == null)
      {
          // Get all accounts
      }
  }
}

Поэтому я пытаюсь настроить заглушку, которая будет вызывать GetAccounts () (которую я хочу использовать в конкретной реализации), но я хотел бы проверить, вызывает ли этот метод GetAccounts (null).

[Test]
public void GetAccountsTest()
{
  MockRepository mocks = new MockRepository();
  MyClass stub = mocks.Stub();
  using(mocks.Record())
  {
     Expect.Call(() => stub.GetAccounts()).CallOriginalMethod();
     Expect.Call(() => stub.GetAccounts(null));
  }
  mocks.ReplayAll();
  stub.GetAccounts();
  mocks.VerifyAll();
}

Проблема в том, что конкретный класс вызывается в строке CallOriginalMethod (), которую я ожидаю вызвать во время воспроизведения, когда я вызываю stub.GetAccounts (). Таким образом, как во время записи, так и во время выполнения тестов, конкретные методы реализации вызываются, когда я просто хочу их смоделировать - отчасти, как я объяснил. Это недоразумение с моей стороны? Разве я не должен быть в состоянии смоделировать / заглушить конкретные классы, а также интерфейсы?

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

Это вообще возможно? Как бы я это сделал?

1 Ответ

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

Похоже, вы захотите использовать PartialMock. Это позволит вам издеваться над виртуальными методами.

...