如何使用给定的表达式作为参数来生成 return of Substitute
How to use the expression given as an argument to generate return of Substitute
我有一个函数可以从存储库中获取一些数据并对其进行处理。我想测试 lambda 表达式是否正确,以及对存储库中的数据做了什么。因此,我的想法不是通过 NSubstitute 为给定的 lambda 表达式提供特定数据,而是设置一个包含多个条目的存储库(基本上是一个列表),然后测试 lambda 表达式是否获取正确的数据。
所以,这是我的存储库:
public class SampleRepository : ISampleRepository
{
public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
{
return dbSet.Where(predicate);
}
}
这是它的用法:
var samples = repository.Get(s => s.Id == id);
// do something with those "samples"
这是我在测试中所做的:
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));
这给了我一个例外,说 samplePredicate
在 .Returns(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);
});
我有一个函数可以从存储库中获取一些数据并对其进行处理。我想测试 lambda 表达式是否正确,以及对存储库中的数据做了什么。因此,我的想法不是通过 NSubstitute 为给定的 lambda 表达式提供特定数据,而是设置一个包含多个条目的存储库(基本上是一个列表),然后测试 lambda 表达式是否获取正确的数据。
所以,这是我的存储库:
public class SampleRepository : ISampleRepository
{
public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
{
return dbSet.Where(predicate);
}
}
这是它的用法:
var samples = repository.Get(s => s.Id == id);
// do something with those "samples"
这是我在测试中所做的:
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));
这给了我一个例外,说 samplePredicate
在 .Returns(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);
});