Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 如何使用给定的表达式作为参数生成替换的返回_C#_Unit Testing_Lambda_Nunit_Nsubstitute - Fatal编程技术网

C# 如何使用给定的表达式作为参数生成替换的返回

C# 如何使用给定的表达式作为参数生成替换的返回,c#,unit-testing,lambda,nunit,nsubstitute,C#,Unit Testing,Lambda,Nunit,Nsubstitute,我有一个函数,可以从存储库中获取一些数据,并对其进行处理。我想测试lambda表达式是否正确,以及如何处理存储库中的数据。因此,我的想法不是通过NSubstitute为给定的lambda表达式提供特定数据,而是建立一个包含多个条目的存储库(基本上是一个列表),然后测试lambda表达式是否获得了正确的数据 这是我的存储库: public class SampleRepository : ISampleRepository { public virtual IEnumerable<T

我有一个函数,可以从存储库中获取一些数据,并对其进行处理。我想测试lambda表达式是否正确,以及如何处理存储库中的数据。因此,我的想法不是通过NSubstitute为给定的lambda表达式提供特定数据,而是建立一个包含多个条目的存储库(基本上是一个列表),然后测试lambda表达式是否获得了正确的数据

这是我的存储库:

public class SampleRepository : ISampleRepository
{
    public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
    {
        return dbSet.Where(predicate);
    }
}
这就是我在测试中所做的:

var repo = Substitute.For<ISampleRepository>();
var samples = new List<Sample>();
samples.Add(new Sample(1)) // insert sample with id 1
samples.Add(new Sample(2)) // insert sample with id 2
Func<Sample, bool> samplePredicate = null;
repo.Get(Arg.Do<Expression<Func<Sample, bool>>>(arg => samplePredicate = arg.Compile()));
repo.Get(Arg.Any<Expression<Func<Sample, bool>>>()).Returns(samples.Where(samplePredicate));
var repo=Substitute.For();
var samples=新列表();
samples.Add(新样本(1))//插入id为1的样本
samples.Add(新样本(2))//插入id为2的样本
Func samplePredicate=null;
Get(Arg.Do(Arg=>samplePredicate=Arg.Compile());
Get(Arg.Any()).Returns(samples.Where(samplePredicate));
这给了我一个例外,说
samplePredicate
中为空。返回(samples.Where(samplePredicate))

这是有道理的,因为当时还没有调用被测单元,因此没有给出任何参数


然而,有没有一种方法可以实现这一点?例如,告诉NSubstitute不要执行列表上的
。Where()

在模拟repo上配置期望时,所有这些都应该在一个表达式语句中完成

//Arrange
var repo = Substitute.For<ISampleRepository>();
var samples = new List<Sample>();
samples.Add(new Sample(1)) // insert sample with id 1
samples.Add(new Sample(2)) // insert sample with id 2

repo.Get(Arg.Any<Expression<Func<Sample, bool>>>())
    .Returns(arg => {
        var predicate = arg.ArgAt<Expression<Func<Mitarbeiter, bool>>>(0).Compile();
        return samples.Where(predicate);            
    });
//排列
var repo=替换为();
var samples=新列表();
samples.Add(新样本(1))//插入id为1的样本
samples.Add(新样本(2))//插入id为2的样本
repo.Get(Arg.Any())
.Returns(arg=>{
var谓词=arg.ArgAt(0.Compile();
返回样本。其中(谓词);
});
//Arrange
var repo = Substitute.For<ISampleRepository>();
var samples = new List<Sample>();
samples.Add(new Sample(1)) // insert sample with id 1
samples.Add(new Sample(2)) // insert sample with id 2

repo.Get(Arg.Any<Expression<Func<Sample, bool>>>())
    .Returns(arg => {
        var predicate = arg.ArgAt<Expression<Func<Mitarbeiter, bool>>>(0).Compile();
        return samples.Where(predicate);            
    });