Rhino Mocks, или StructureMap AutoMocks, как заглушки функций в том же / Наследовать класс?
Я пытаюсь проверить класс доступа к данным. По сути, функция 1 читает данные напрямую из DataContext, а другая функция 2 добавляет фильтры. function1 и function2 могут быть в одном классе или наследовать класс.
Как я могу заглушить возвращаемое значение function1 и проверить function2?
Пример кода, который я получил далеко, но он не работает. Я пытался использовать Rhino Mocks и StructureMap Auto Mock, все еще получая ошибки при заглушке.
Любая помощь приветствуется. Большое спасибо.
public class TestClass : ITestClass
{
private DbContext _context;
public IEnumerable<TestObject1> TestFunction1()
{
return _context.GetSomething();
}
public TestObject2 TestFunction2()
{
return TestFunction1().Where(x=>x.Parent == null);
}
}
public interface ITestClass
{
IEnumerable<TestObject1> TestFunction1();
TestObject2 TestFunction2();
}
[Test]
public void TestFunction2_Test()
{
var mock = MockRepository.GenerateMock<TestClass>();
var test = new List<TestObject1>();
mock.Stub(x=>x.TestFunction1()).Return(test);
var result = mock.TestFunction2();
Assert.AreSame(1, result.Count());
}
1 ответ
То, что вам нужно для того, чтобы заставить это работать, - это "частичная насмешка". Moh Rhino может заглушать виртуальные методы только при выполнении частичных mock. Если вы отметите TestFunction1
как virtual
он должен работать.
Также вы должны использовать Assert.AreEqual
, так как он проверяет равенство значений ("эквивалентны ли объекты?"). Assert.AreSame
проверяет равенство ссылок ("это один и тот же объект?"). Смотрите этот ответ для дальнейшего объяснения.
Что касается частичных издевательств в целом, их следует избегать. Необходимость выполнять частичные макеты часто свидетельствует о том, что класс пытается сделать слишком много. Либо протестируйте функцию как часть модульного теста класса, либо извлеките ее в отдельный сотрудничающий класс.