Вот мой класс для тестирования:
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
, а не вызывает исключение.
Так как я могу его бросить?
Аргумент, переданный в настройке, не соответствует экземпляру, переданному при выполнении теста. В этом сценарии вам нужно будет использовать сопоставление аргументов, чтобы код работал должным образом.
Setting expectations for protected members, if you need argument matching, you MUST use
ItExpr
rather thanIt
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: Разное
Как магия. Большое спасибо.