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;
        }

c# moq测试异步任务

最初的问题是接口是私有的(但猜测这是由于最小的示例)。

得到以下错误

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();
}