gpt4 book ai didi

c# - 使用 Moq 和 C# 调用作为参数传递给模拟的 Func

转载 作者:太空狗 更新时间:2023-10-29 18:25:27 24 4
gpt4 key购买 nike

我有一个看起来像这样的模拟方法:


class NotMineClass {
T Execute(Func operation)
{
// do something
return operation();
}
}

在我的代码中,我这样做:


public MyType MyMethod()
{
MyType object = new MyType();
bool success = notMineClassInstance.Execute(() =>
{
// some things
retVal = injectedObject1.method();
object.attribute = injectedObject2.method();
// some other things
return retVal;
}
if (success)
{
object.otherAttribute = someValue;
}
return object;
}

我的情况是,我正在使用 Moq 测试 MyMethod,我想验证 Func 的行为是否符合预期。我在它的 body 里有一些注入(inject)的对象,是模拟的,应该被验证;它还开始构建我的返回值,所以我不能做任何断言,除非我调用作为参数传递的函数。

在 Java 和 jUnit + EasyMock 中,我会捕获传递的参数,如下所示:


public void testMyMethod() {
// ...
Capture < Function < void, Boolean > > functionCapture = Captures.last();
expect(notMineClassInstance.execute(EasyMock.capture(functionCapture)));
// Expectations for the body of the function

replay();

functionCapture.getValue().apply(null);
}

如何使用 C# + Moq 执行相同的操作?

最佳答案

您可以在为方法提供Returns 时捕获调用参数:

Mock<NotMineClassInstance> mock = new Mock<NotMineClassInstance>();
mock.Setup(x => x.Execute<bool>(It.IsAny<Func<bool>>()))
.Returns((Func<bool> captured) => { captured(); return true; });

这是对您的代码的完整测试:

[Test]
public void TestingSomething()
{
// Arrange
Mock<NotMineClassInstance> mockNotMine = new Mock<NotMineClassInstance>();
mockDep.Setup(x => x.Execute<bool>(It.IsAny<Func<bool>>())).Returns((Func<bool> func) => func());

Mock<Injected1> mockInjected1 = new Mock<Injected1>();
mockInjected1.Setup(i => i.Method()).Returns(true);

Mock<Injected2> mockInjected2 = new Mock<Injected2>();
mockInjected2.Setup(i => i.Method()).Returns("xxx");

YourClass yourObject = new YourClass(mockDep.Object, mockInjected1.Object, mockInjected2.Object);

// Act
MyType my = yourObject.MyMethod();

// Assert
mockNotMine.Verify(d => d.Execute<bool>(It.IsAny<Func<bool>>()));
mockInjected1.Verify(i => i.Method());
mockInjected2.Verify(i => i.Method());

Assert.That(my.Attribute, Is.EqualTo("xxx"));
Assert.That(my.OtherAttribute, Is.EqualTo(someValue));
}

您还需要测试 mockInjected1.Method 返回 false 时的情况。

关于c# - 使用 Moq 和 C# 调用作为参数传递给模拟的 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215454/

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