c#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

我试图使用Moq测试一些异步任务,但没有成功

我可以使模拟的东西,但当我尝试使用mock.Object时,它抛出(Object='m.Object'抛出了一个类型为'Castle.DynamicProxy.Generators.GeneratorException'的异常),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();
        }
接口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()部分的测试。如果所有测试都已完成,我如何测试?少了什么?干杯。这超出了我目前对该主题的知识基础。搜索后询问社区,看看他们是否能提供帮助。编码快乐!!!!