Я новичок в юнит-тестировании и макете в целом и пытаюсь настроить тесты для одного из моих классов, где я хочу убедиться, что определенный метод вызывается из другого метода в том же классе. Поэтому я хотел бы использовать конкретную реализацию, но макетировать ее части. Возможно ли это?
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 ().
Таким образом, как во время записи, так и во время выполнения тестов, конкретные методы реализации вызываются, когда я просто хочу их смоделировать - отчасти, как я объяснил. Это недоразумение с моей стороны? Разве я не должен быть в состоянии смоделировать / заглушить конкретные классы, а также интерфейсы?
Нужно ли добавлять виртуальное ключевое слово к методам, которые я хочу использовать для макета?
Это вообще возможно? Как бы я это сделал?