C# 用接口模拟Moq中的泛型方法
我正在尝试为以下通用接口设置moq,但遇到异常C# 用接口模拟Moq中的泛型方法,c#,unit-testing,moq,C#,Unit Testing,Moq,我正在尝试为以下通用接口设置moq,但遇到异常 public interface IReadAccess<TEntity> { Task<IEnumerable<TEntity>> GetAll(); } var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict); m.Setup(p => p.GetAll()).ReturnsAsync(new List&
public interface IReadAccess<TEntity>
{
Task<IEnumerable<TEntity>> GetAll();
}
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());
m.VerifyAll();
公共接口IReadAccess
{
任务GetAll();
}
var m=新模拟(MockBehavior.Strict);
m、 Setup(p=>p.GetAll()).ReturnsAsync(newlist());
m、 VerifyAll();
获取以下异常
public interface IReadAccess<TEntity>
{
Task<IEnumerable<TEntity>> GetAll();
}
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());
m.VerifyAll();
Moq.MockException
HResult=0x80131500
消息=模拟上的以下设置
“模仿”
不匹配:
IReadAccess p=>p.GetAll()
来源=最小起订量
堆栈跟踪:
在Moq.Mock.VerifyAll()时
在EPIC.Tests.Business.Rules.Announcements.AnnouncementPlanning.CrosscutsProgrammaticActivitiesValidationRuleServiceTests.d_u5.MoveNext()中
在D:\dev\main\Tests\EPIC.Tests.Business.Rules\Announcements\AnnouncementPlanning\crosscutsProgrammaticactivesValidationRuleServiceTests.cs中:第108行
您的测试正确失败,因为您试图验证是否调用了GetAll(),即使您实际上没有调用它
如果您在测试或正在测试的代码中调用该方法,则它将通过
[Fact]
public async Task Test1()
{
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());
var result = await m.Object.GetAll();
m.VerifyAll();
}
[事实]
公共异步任务Test1()
{
var m=新模拟(MockBehavior.Strict);
m、 Setup(p=>p.GetAll()).ReturnsAsync(newlist());
var result=wait m.Object.GetAll();
m、 VerifyAll();
}
提示出现在您的错误消息中:
消息=模拟上的以下设置。。。。不匹配:
IReadAccess p=>p.GetAll()谢谢康奈尔,这是预期的工作,但我有类似的方法
public interface IReadAccess<TEntity>
{
Task<IEnumerable<TEntity>> GetAll();
Task<IEnumerable<TEntity>> Find(FormattableString whereClause, object whereClauseObject);
}
公共接口IReadAccess
{
任务GetAll();
任务查找(FormattableString whereClause、object whereClauseObject);
}
并试图设置
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(x => x.Find($"ID = @ID", new { ID = 5 })).ReturnsAsync(new List<Foo>());
var result = await m.Object.Find($"ID= @ID", new { ID = 5 });
m.VerifyAll();
var m=newmock(MockBehavior.Strict);
m、 安装程序(x=>x.Find($“ID=@ID”,new{ID=5})).ReturnsAsync(new List());
var result=wait m.Object.Find($“ID=@ID”,new{ID=5});
m、 VerifyAll();
在对现有代码进行了一些更改之后,现在安装程序工作正常,但在实际服务中调用测试更新代码时出错
var test = new Test {ID = 5};
object whereClause = new { ID = test.ID };
FormattableString formattableString = $"ID = @ID";
m.Setup(x => x.Find(formattableString, whereClause)).ReturnsAsync(new List<Foo>());
var ruleServiceOutput = await this.testValidationRuleService.ExecuteAsync(test);
var测试=新测试{ID=5};
对象whereClause=new{ID=test.ID};
FormattableString FormattableString=$“ID=@ID”;
m、 Setup(x=>x.Find(formattableString,whereClause)).ReturnsAsync(new List());
var ruleServiceOutput=wait this.testValidationRuleService.ExecuteAsync(test);
实际代码
public async Task<IRuleServiceOutput<bool>> ExecuteAsync(Test test)
{
var errors = new List<string>();
object whereClause = new { ID = test.ID };
FormattableString formattableString = $"ID = @ID";
var output = (await m.Find(formattableString, whereClause)).ToArray();
return new RuleServiceOutput<bool>(output.Errors.IsEmpty(), output.Errors);
}
公共异步任务ExecuteAsync(测试)
{
var errors=新列表();
对象whereClause=new{ID=test.ID};
FormattableString FormattableString=$“ID=@ID”;
var output=(wait m.Find(formattableString,whereClause)).ToArray();
返回新的RuleServiceOutput(output.Errors.IsEmpty(),output.Errors);
}
'IReadAccess`1.Find(ID=@ID,{ID=5})调用失败,模拟行为严格。
模拟上的所有调用都必须有相应的设置。”
设置MockBehavior后。默认一切正常:)您能修复代码片段,以便我们查看您的模拟是如何设置的吗?在
设置
和验证所有
之间是否有一些代码实际调用了GetAll
方法?请阅读指南和帖子,以显示与您的方法匹配并复制的代码错误消息。目前的代码显然是一些简化,不会导致显示错误。谢谢Connell,这是预期的工作,但我有类似的方法公共接口IReadAccess{Task GetAll();}试着像这样设置模拟m.Setup(x=>x.Find(It.IsAny(),It.IsAny()).ReturnsAsync(new List())代码>