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