c#moq测试异步任务
我试图使用Moq测试一些异步任务,但没有成功 我可以使模拟的东西,但当我尝试使用mock.Object时,它抛出(Object='m.Object'抛出了一个类型为'Castle.DynamicProxy.Generators.GeneratorException'的异常),VS停止调试/运行 以下是测试的最小起重量(Moq)方法:c#moq测试异步任务,c#,unit-testing,asynchronous,moq,C#,Unit Testing,Asynchronous,Moq,我试图使用Moq测试一些异步任务,但没有成功 我可以使模拟的东西,但当我尝试使用mock.Object时,它抛出(Object='m.Object'抛出了一个类型为'Castle.DynamicProxy.Generators.GeneratorException'的异常),VS停止调试/运行 以下是测试的最小起重量(Moq)方法: interface ITestAsync { Task<IEnumerable<string>> g
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();
}
接口ITestAsync
{
任务get();
}
[事实]
公共异步任务MoqShouldReturnFIRST()
{
var m=新的Mock();
m、 Setup(q=>q.get()).ReturnsAsync(null);
var x=await m.Object.get();
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();
}
}
公共类FirstIfNotNullOrEmptyAsyncTests
{
私有异步任务getAll()
{
列表x=新列表();
x、 添加(“01”);
x、 添加(“02”);
等待任务。延迟(1000);
返回x;
}
私有异步任务getNull()
{
列表x=新列表();
x=零;
等待任务。延迟(1000);
返回x;
}
私有异步任务getEmpty()
{
列表x=新列表();
等待任务。延迟(1000);
返回x;
}
[事实]
公共异步任务ShouldReturnFIRST()
{
var x=await getAll().FirstIfNotNullOrEmptyAsync();
x、 应()为(“01”);
}
[事实]
公共异步任务应返回NullForNull()
{
var x=await getNull().firstifnotnull或mptyasync();
x、 Should().BeNull();
}
[事实]
公共异步任务应返回NullForempty()
{
var x=await getEmpty();
x、 Should().BeNull();
}
}
我尝试测试的扩展是:
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;
}
公共静态异步任务FirstIfNotNullOrEmptyAsync(此任务obj),其中T:class
{
var结果=等待obj;
return(result!=null&&result.Any())?result?.FirstOrDefault():null;
}
唯一的初始问题是接口是私有的(但猜测这是由于最小的示例)
得到以下错误
Castle.DynamicProxy.Generators.GeneratorException:无法创建
类型代理
最小起订量为'1[[******+ITestAsync,
*****,版本=1.0.0.0,区域性=中性,PublicKeyToken=null]]
因为****+ITestAsync类型不是
可到达的将其公开或内部,并用
[大会:
InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
属性,因为程序集Moq是强名称
一旦接口公开,所有工作/传递
public interface ITestAsync {
Task<IEnumerable<string>> get();
}
公共接口ITestAsync{
任务get();
}
根据示例重新创建的测试所有测试都通过。最初唯一的问题是接口是私有的(但猜测这是因为很少有示例)。一旦接口公开,所有工作/通过的内容都包括整个异常消息,这太完美了!工作!另一个问题。运行代码覆盖率,即使这些测试测试了扩展的所有可能性,它说只有90%的覆盖率,因为缺少MoveNext()部分的测试。如果所有测试都已完成,我如何测试?少了什么?干杯。这超出了我目前对该主题的知识基础。搜索后询问社区,看看他们是否能提供帮助。编码快乐!!!!