c#moq测试异步任务

时间:2016-11-09 13:42:38

标签: c# unit-testing asynchronous moq

我正在尝试使用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();
        }

以下是使用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();
        }
    }

我试图测试的是:

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

1 个答案:

答案 0 :(得分:1)

唯一的问题是界面是私有的(但猜测是由于最小的例子)。

出现以下错误

  

Castle.DynamicProxy.Generators.GeneratorException:无法创建   代理类型   Moq.IMocked`1 [[**** + ITestAsync,   *****,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]   因为类型**** + ITestAsync不是   无障碍。将其公开或内部并标记您的程序集   [部件:   InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]   属性,因为程序集Moq具有很强的名称。

一旦界面公开,所有工作/通过

public interface ITestAsync {
    Task<IEnumerable<string>> get();
}
相关问题