gpt4 book ai didi

c# - 在犀牛模拟中模拟 lambda

转载 作者:太空狗 更新时间:2023-10-30 00:22:05 24 4
gpt4 key购买 nike

我正在尝试使用 Rhino Mocks 来模拟以下 lambda,但一直碰壁

var result = rep.Find<T>(x => (x as IEntity).ID == (entity as IEntity).ID).FirstOrDefault();

有什么想法吗?

最佳答案

在单元测试中,您拥有被测系统 (SUT) 及其协作者。模拟的目的是用你完全控制的东西取代合作者。这样您就可以设置不同的测试用例,并且可以专注于测试被测系统的行为,而不是其他任何东西。

在这种情况下,我假设 rep 对象是 SUT。您传递给 SUT 的 Find 方法的 lambda 可以被视为协作者。由于您已经完全控制了该 lambda,因此尝试使用 Rhino Mocks 模拟它并没有什么意义。

无论如何,我将尝试给出一个涉及 Rhino Mocks 和 lambda 的单元测试示例;-) 这是一个示例测试,它创建一个始终返回 false 的谓词 stub ,并验证 Find 方法实际上调用了那个谓词:

[Test]
public void Find_returns_nothing_if_predicate_always_false()
{
var predicateStub = MockRepository.GenerateStub<Func<Entity,bool>>();
predicateStub.Stub(x => x(Arg<Entity>.Is.Anything)).Return(false);

var repository = new Repository();
var entities = repository.Find(predicateStub);

Assert.AreEqual(0, entities.Count(),
"oops, got results while predicate always returns false");
predicateStub.AssertWasCalled(x => x(Arg<Entity>.Is.Anything));
}

当然,就像在您自己的示例中一样,您在这里并不真的需要 Rhino Mocks。 lambda 语法的全部意义在于可以轻松地提供就地实现:

[Test]
public void Find_returns_nothing_if_predicate_always_false()
{
bool predicateCalled = false;
Func<Entity,bool> predicate = x => { predicateCalled = true; return false; };

var repository = new Repository();
var entities = repository.Find(predicate);

Assert.AreEqual(0, entities.Count(),
"oops, got results while predicate always returns false");
Assert.IsTrue(predicateCalled, "oops, predicate was never used");
}

关于c# - 在犀牛模拟中模拟 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com