如何验证作为方法参数传入的Action对Status属性的设置?
验证NSubstitute中传入的Action委托行为
你可以通过捕获传入的Action委托并执行它,然后检查目标对象的属性变化来实现验证。具体步骤如下:
1. 捕获传入的Action
使用NSubstitute的Arg.Do<T>方法,在UpdateStatus被调用时,获取传入的Action<Status>委托。
2. 执行Action并验证结果
创建一个Status实例,将其传入捕获到的Action中执行,然后检查该实例的XReceived属性是否被设置为Received状态。
完整测试代码
[TestClass] public class UnitTest1 { [TestMethod] public void UpdateX_SetsXReceivedToReceived() { // Arrange var mockHandler = Substitute.For<IHandler>(); var sequencer = new Sequencer(mockHandler); Status testStatus = new Status(); Action<Status> capturedAction = null; // 捕获传入的Action mockHandler.When(h => h.UpdateStatus(Arg.Any<Action<Status>>())) .Do(callInfo => capturedAction = callInfo.Arg<Action<Status>>()); // Act sequencer.UpdateX(); // Assert // 执行捕获到的Action capturedAction(testStatus); // 验证属性是否被正确设置 Assert.AreEqual(Status.ReceivedStatus.Received, testStatus.XReceived); // 同时可以验证UpdateStatus确实被调用过 mockHandler.Received().UpdateStatus(Arg.Any<Action<Status>>()); } }
代码说明
mockHandler.When(...):监听UpdateStatus方法的调用,当方法被触发时,通过callInfo.Arg<Action<Status>>()获取传入的委托并保存到capturedAction变量中。- 执行
capturedAction(testStatus):模拟Handler内部调用Action的行为,让作用于我们自己创建的testStatus实例上。 - 最后断言
testStatus.XReceived的值,确认Action的逻辑符合预期。
如果要测试UpdateY方法,只需要把测试方法中的sequencer.UpdateX()换成sequencer.UpdateY(),然后断言testStatus.YReceived即可。
内容的提问来源于stack exchange,提问作者GraySquid
相关产品推荐
相关产品推荐

