Как я могу издеваться над асинхронно защищенным методом с параметром? - PullRequest
0 голосов
/ 27 октября 2018

Вот мой класс для тестирования:

namespace ClassLibrary1
{
    public class MyBase
    {
        public async Task DoSomething (MyContext context) => await DoSomethingInternal (context);
        public async Task DoSomething() => await DoSomethingInternal();

        protected virtual async Task DoSomethingInternal(MyContext context) { }
        protected virtual async Task DoSomethingInternal() { }
    }

    public class MyContext { }

    public class MyClass : MyBase
    {
        protected override Task DoSomethingInternal(MyContext context) => Task.CompletedTask;
        protected override Task DoSomethingInternal() => Task.CompletedTask;
    }
}

А вот код теста:

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        [ExpectedException(typeof(TaskCanceledException))]
        public async Task TestMethod1()
        {
            var mock = new Mock<MyClass>
            {
                CallBase = true
            };
            mock.Protected().Setup<Task>("DoSomethingInternal", new MyContext()).ThrowsAsync(new TaskCanceledException());
            var obj = mock.Object;

            await obj.DoSomething(null);
        }

        [TestMethod]
        [ExpectedException(typeof(TaskCanceledException))]
        public async Task TestMethod2()
        {
            var mock = new Mock<MyClass>
            {
                CallBase = true
            };
            mock.Protected().Setup<Task>("DoSomethingInternal").ThrowsAsync(new TaskCanceledException());
            var obj = mock.Object;

            await obj.DoSomething();
        }
    }
}

Результат показывает, что первый тест не пройден, а второй успешен.Отладка показывает, что первый тестовый вызов DoSomethingInternal(context) возвращает Task.CompletedTask, а не вызывает исключение.

Так как я могу заставить его бросить?

1 Ответ

0 голосов
/ 27 октября 2018

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

Установка ожиданий для защищенных членов. Если вам нужно сопоставить аргументы, вы ДОЛЖНЫ использовать ItExpr вместо It

var mock = new Mock<MyClass>() {
    CallBase = true
};

mock.Protected()
    .Setup<Task>("DoSomethingInternal", ItExpr.IsAny<MyContext>())
    .ThrowsAsync(new TaskCanceledException());

var obj = mock.Object;

await obj.DoSomething(null);

Ссылка Moq Quickstart: Разное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...