gpt4 book ai didi

c# - 使用 Moq,如何在另一个方法的回调中更改方法的设置?

转载 作者:行者123 更新时间:2023-11-30 23:10:16 26 4
gpt4 key购买 nike

我正在尝试为我的测试模拟第三方组件。该组件可以存储字节数组,但没有属性,只有两种方法可以访问它。

// simple demo code, _comp is an object of this component
byte[] val = new byte[] { 5 };
// write new value
await _comp.WriteAsync(val);
// read value
byte[] newVal = _comp.ReadAsync();

现在在我的测试中,我想我可以只设置 WriteAsync 方法来更改 ReadAsync 方法的设置以返回传入的值。

Mock<IComponent> comp = new Mock<IComponent>;
comp.Setup(x => x.WriteAsync(It.IsAny<byte[]>())).Callback<byte[]>(bytes =>
{
comp.Setup(x => x.ReadAsync()).ReturnsAsync(bytes);
});

但是当我在测试中调试演示代码时一切正常,行

comp.Setup(x => x.ReadAsync()).ReturnsAsync(bytes);

是用正确的值调用的,但是当 WriteAsync 调用返回时,我在该行的演示代码中得到了一个 NullReferenceException

await _comp.WriteAsync(val);

我不知道这里什么是 null,_compval 不是。我相信它在 Moq 框架中很深,但我没有得到任何关于它的堆栈跟踪信息。 Stacktrace 仅包含我的演示代码。

我是不是做错了什么?或者不可能从它自己的回调之一中更改模拟对象?我想,我需要的可以用一个属性来完成,但不幸的是组件没有。

最佳答案

将写入的字节存储在局部变量中作为模拟的后备存储。在回调中设置数组的值,以便它在 ReadAsync 中使用时可用。

WriteAsync也是一个异步方法,所以它需要返回一个 Task允许异步流。

Mock<IComponent> comp = new Mock<IComponent>();
byte[] bytes = null;
comp.Setup(x => x.WriteAsync(It.IsAny<byte[]>()))
.Callback<byte[]>(b => bytes = b)
.Returns(Task.FromResult((object)null));
comp.Setup(x => x.ReadAsync()).ReturnsAsync(bytes);

根据评论更新。

在评论中提到 WriteAsync 返回 Task<bool> .虽然根据 OP 中提供的内容,返回值的条件是未知的,但基于提供的数组的条件示例如下所示

.Returns<byte[]>(b => Task.FromResult(b != null && b.Length > 0));

关于c# - 使用 Moq,如何在另一个方法的回调中更改方法的设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45478657/

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