moq objects Повертає метод, повинен повернути нульовий об'єкт


76

Я розробляю веб-API, і один із тестів, який я придумав, полягає в тому, що якщо клієнт робить операцію GET з ідентифікатором фізичного тесту (фізичний тест - це ресурс, який я шукаю), і що фізичний тест не знайдений , веб-API повинен повернути статус 404.

Зараз я використовую фреймворк moq для своїх тестів, і я маю такий код:

[TestMethod]
public void then_if_physical_test_not_found_return_not_found_status()
{
    var unitOfWork = new Mock<IUnitOfWork>();
    var repository = new Mock<IRepository<PhysicalTest>>();
    repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
    unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
    var pt = new PhysicalTestResource(unitOfWork.Object);
    HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
    Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
}

Мені потрібен метод Returns (), щоб повернути нульовий об'єкт, який буде те, що поверне фактичний метод API, якщо ресурс не знайдено.

Я спробував надіслати null як параметр у методі Returns (), але не мав успіху.

Відповіді:


223

Ви не вказуєте, в чому була помилка, але це має спрацювати:

unitOfWork.Setup(m => m.PhysicalTests).Returns((IRepository<PhysicalTest>)null);

Я підозрюю, що ви намагалися викликати це Returns(null), що викликає скаргу компілятора, оскільки Returnsвін перевантажений, і він не знає, який метод слід викликати. Кастинг до певного типу усуває двозначність.


8
це спрацювало, але мені довелося внести цю модифікацію: unitOfWork.Setup (m => m.PhysicalTests) .Returns (((PhysicalTest) null);
Даніель

1
ах, добре ... Я припустив, що оскільки ви намагалися повернути repository.Object, саме такий тип повернув PhysicalTests.
Джефф Огата,

Я спробував те саме, і я отримую System.NotSupportedException. {"Недійсне налаштування на невіртуальному (перевизначуваному в VB) елементі: x => x.GetFoo (.value.Id)"} Будь-які ідеї?
Dan Csharpster

@DanCsharpster Ви можете використовувати Moq лише на інтерфейсах або абстрактних класах з віртуальними членами. Незалежно від того, який клас ви використовуєте, це тип x- це конкретний клас або абстрактний клас, який має GetFoo()як невіртуальний / переоцінюваний.
bcr

1
Я можу рекомендувати такий спосіб вирішення двозначності перевантаження. Я просто хочу зазначити, що, оскільки дві негенеричні перевантаження, Returnsякі тут важливі, мають різні імена для свого параметра, ви також можете усунути неоднозначність, написавши: ... .Returns(value: null)(ось valueлише назва параметра в перевантаженні, яке ми хочемо , це не ключове слово).
Jeppe Stig Nielsen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.