Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用接口模拟Moq中的泛型方法_C#_Unit Testing_Moq - Fatal编程技术网

C# 用接口模拟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&

我正在尝试为以下通用接口设置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<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())