c# moq测试异步任务
本文关键字:任务 异步 测试 moq | 更新日期: 2023-09-27 18:17:18
我正在尝试使用Moq测试一些异步任务的东西没有成功。
我可以制作模拟的东西,但是当我尝试使用mock时。对象(Object = 'm.Object'抛出类型为' castle . dynamicproxy . generators . generatoreexception '的异常),VS停止调试/运行。
下面是测试的Moq方式:
interface ITestAsync
{
Task<IEnumerable<string>> get();
}
[Fact]
public async Task MoqShouldReturnFIRST()
{
var m = new Mock<ITestAsync>();
m.Setup(q => q.get()).ReturnsAsync(null);
var x = await m.Object.get().FirstIfNotNullOrEmptyAsync();
x.Should().BeNull();
}
下面是使用xUnit
的传统方法的测试public class FirstIfNotNullOrEmptyAsyncTests
{
private async Task<IEnumerable<string>> getAll()
{
List<string> x = new List<string>();
x.Add("01");
x.Add("02");
await Task.Delay(1000);
return x;
}
private async Task<IEnumerable<string>> getNull()
{
List<string> x = new List<string>();
x = null;
await Task.Delay(1000);
return x;
}
private async Task<IEnumerable<string>> getEmpty()
{
List<string> x = new List<string>();
await Task.Delay(1000);
return x;
}
[Fact]
public async Task ShouldReturnFIRST()
{
var x = await getAll().FirstIfNotNullOrEmptyAsync();
x.Should().Be("01");
}
[Fact]
public async Task ShouldReturnNULLforNULL()
{
var x = await getNull().FirstIfNotNullOrEmptyAsync();
x.Should().BeNull();
}
[Fact]
public async Task ShouldReturnNULLforEMPTY()
{
var x = await getEmpty().FirstIfNotNullOrEmptyAsync();
x.Should().BeNull();
}
}
我要测试的extension是:
public static async Task<T> FirstIfNotNullOrEmptyAsync<T>(this Task<IEnumerable<T>> obj) where T : class
{
var result = await obj;
return (result != null && result.Any()) ? result?.FirstOrDefault() : null;
}
最初的问题是接口是私有的(但猜测这是由于最小的示例)。
得到以下错误
Castle.DynamicProxy.Generators。generatoreexception:不能创建类型代理Moq。IMocked ' 1 [[* * * * + ITestAsync,*****,版本=1.0.0.0,文化=中性,PublicKeyToken=null]]因为****+ITestAsync类型不是可访问。将其设置为公共或内部,并将程序集标记为[组装:InternalsVisibleTo (InternalsVisible.ToDynamicProxyGenAssembly2)]属性,因为程序集Moq是强命名的。
一旦接口被公开,一切都工作了/通过
public interface ITestAsync {
Task<IEnumerable<string>> get();
}