gpt4 book ai didi

c# - 使用具有 ref 参数的方法的 AssertWasCalled 和 Stub

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:48 24 4
gpt4 key购买 nike

我在使用 ref 参数 stub 方法时遇到问题。
我想为某个输入值 stub 该方法并检查它是否被调用。
我的尝试:

// Variables needed - can be skipped
var activity = MockRepository.GenerateMock<ICompositeActivity<object>>();
var context = new Context<object>(new object());
var inputValue = MockRepository.GenerateMock<IActivity<object>>();
var outputValue = MockRepository.GenerateMock<IActivity<object>>();
var executeCalled = 0;

// The stub:
activity.Stub(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(inputValue), outputValue).Dummy))
.WhenCalled(i => ++executeCalled).Return(true);

var tmp = inputValue;
tmp.ShouldBeTheSameAs(inputValue);

// The execution:
activity.Execute(context, ref tmp);

// The check:
inputValue.ShouldNotBeTheSameAs(outputValue); // Passes, ok
tmp.ShouldBeTheSameAs(outputValue); // Passes, ok
executeCalled.ShouldEqual(1); // Passes, ok

// Passes. Why?
activity.AssertWasCalled(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(outputValue), null).Dummy));

// Doesn't pass. Why?
activity.AssertWasCalled(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(inputValue), outputValue).Dummy));

顺便说一句:我知道,这个测试没有任何意义,因为它不测试任何真实的类。这是我真实测试的浓缩版,用于说明问题。

如您所见,发生了一些奇怪的事情:

execute 方法的 stub 是正确的,它被调用了,因为 executeCalled 为 1 并且 tmp 参数已从 inputValue 更改到 outputValue
但是:

  • 第一次使用 AssertWasCalled 检查 通过,虽然它检查了 Execute 是否使用 outputValue 调用,这它不是。
  • 第二次检查 AssertWasCalled 失败,尽管它检查了 Execute 是否使用 inputValue 调用,这是的。

此外,当我在 stub 的 WhenCalled 中检查 i.Arguments[1] 时,它是 outputValue,而不是 inputValue ...看起来 Rhino Mocks 正在将输入值更改为指定的返回值,甚至在调用 stub 之前...

这是 Rhino Mocks 中的错误吗?或者我错过了什么?如果它是一个错误,除了 executeCalled 计数器之外,是否有任何解决方法?

最佳答案

相同的测试,稍微清理一下:

    public interface IX
{
void Execute(ref object param);
}

[TestMethod]
public void TestMethod()
{
// Variables needed - can be skipped
var inputValue = new object();
var outputValue = new object();
IX activity = MockRepository.GenerateMock<IX>();

// The stub:
activity
.Stub(x => x.Execute(
ref Arg<object>.Ref(Is.Same(inputValue), outputValue).Dummy));

var tmp = inputValue;

activity.Execute(ref tmp);

activity
.AssertWasCalled(x => x.Execute(
ref Arg<object>.Ref(Is.Same(outputValue), null).Dummy));
}

它通过了。它清楚地表明 Rhino 记录的是输出值,而不是原始输入值。它很少被识别,因为你需要这个临时变量来测试这个效果。

下面的测试也通过了:

    [TestMethod]
public void TestMethod()
{
// Variables needed - can be skipped
var inputValue = new object();
var outputValue = new object();
IX activity = MockRepository.GenerateMock<IX>();

// The stub:
activity
.Stub(x => x.Execute(
ref Arg<object>.Ref(Is.Same(inputValue), outputValue).Dummy));

activity.Execute(ref inputValue);

activity
.AssertWasCalled(x => x.Execute(
ref Arg<object>.Ref(Is.Same(inputValue), null).Dummy));
}

它可以被看作是一个错误,但却是一个相当微妙的案例。如果真的是个问题,你可以看看 Rhinos 的代码,看看这个 bug 是否容易修复。

关于c# - 使用具有 ref 参数的方法的 AssertWasCalled 和 Stub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5673248/

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