Rhino Mocks - Слой репозитория Testing возвращает ошибку «ссылка на объект не установлена ​​на экземпляр» - PullRequest
3 голосов
/ 14 ноября 2011

Благоразумно, что я, во-первых, говорю, что я новичок как в Rhino Mocks, так и в общих чертах.

Имея это в виду, я пытаюсь провести модульное тестирование своего уровня репозитория Linq to SQL, чтобыудаляются правильные методы в текстовом тексте данных и что LINQ to SQL фильтруется правильно.

~ EDITED для ясности ~

Рассматриваемый метод - 'GetRecordWhere' - определен в репозиторииучебный класс.Он вызывает метод - «GetTable» - для DataContextWrapper, который является моей пользовательской оболочкой для Linq to SQL DataContext (автоматически сгенерированный), который был реализован для того, чтобы сделать DataContext способным к изменению.в настоящее время сталкивается с, бросается при попытке заглушить метод 'GetTable', чтобы обеспечить запрашиваемый набор результатов, который можно запросить с помощью метода 'GetRecordWhere'.

Значение ArgumentNullExcpetion: не может быть нулевым.генерируется со ссылкой на строку:

Arg<Expression<Func<Billing, bool>>>.Is.Anything

.., которую я также пытался использовать с Is.NotNull и конкретным предикатом.

Пример юнит-теста:

    _dataContext = MockRepository.GenerateMock<IDataContextWrapper>();

    [Test]
    public void GetRecordWhere()
    {
        // Arrange
        var billing = new Billing { BillingId = 1 };
        var billingQueryList = new List<Billing> {billing};
        const int testId = 1;

       _dataContext.Stub(x => x.GetTable<Billing>()
                .Where(Arg<Expression<Func<Billing, bool>>>.Is.Anything)
                .SingleOrDefault())
                .Return(billing);

        _intRepository = new Repository(_dataContext);

        // Act
        var result = _intRepository.GetRecordWhere<Billing>(x => x.BillingId == testId);

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual(result.BillingId, testId);
        _dataContext.AssertWasCalled(x => x.GetTable<Billing>());
    }

Это ошибка в моем понимании RhinoMocks?

Помощь приветствуется!

1 Ответ

3 голосов
/ 14 ноября 2011

Любой метод, который вы хотите смоделировать с помощью Rhino.Mocks, должен быть виртуальным, чтобы Rhino.Mocks мог его перехватить и обеспечить заданное вами поведение с заглушкой / насмешкой.Глядя на ваше определение GetTable, оно не является виртуальным и, следовательно, не может быть смоделировано.

ОБНОВЛЕНИЕ:

Не «связывайте» ваши методы издевательства,Просто определите, что вы хотите, чтобы метод делал, и верните значение:

_dataContext.Stub(x => x.GetTable<Billing>()).Return(billingQueryList.AsQueryable());

Я только что подключил ваш пример кода к юнит-тесту, и с описанной выше настройкой заглушки тест пройден.

...