【发布时间】:2020-03-13 12:49:50
【问题描述】:
我正在进行单元测试,我想验证一个模拟对象是否收到了正确的谓词参数。但是,我无法让它发挥作用。
这是代码的骨架:
public interface IRepository<T>
{
Task<T> SingleOrDefaultAsync(Expression<Func<T, bool>> predicate);
}
public class MyClass
{
private readonly IRepository<Foo> _repository
public MyClass(IRepository<Foo> repository)
{
_repository = repository;
}
public Task<bool> MyMethod(int id)
{
var foo = _repository.SingleOrDefaultAsync(x => x.Id == id);
return foo != null;
}
}
在我的测试类中,我有以下方法
public async Task MyTestMethod()
{
var repository = Substitute.For<IRepository<Foo>>();
repository.SingleOrDefaultAsync(x => x.Id == 123).Returns(Task.FromResult(new Foo()));
var myClass = new MyClass(repository);
var result = await myClass.MyMethod(123);
result.Should().BeTrue();
}
但是如上所述,这个测试失败了。我可以使用Arg.Any<Expression<Func<Foo, bool>> 让它通过,但感觉不对。
有人建议我做错了什么吗?
【问题讨论】:
-
一般匿名函数不能测试结构相等,只能引用相等。 @Nkosi 的回答显示了解决此问题的一种方法,我写了 some other options too。
标签: c# unit-testing .net-core mocking nsubstitute