gpt4 book ai didi

c# - 使用 RhinoMocks 模拟引用参数

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

我的代码,我有以下调用:

 string proposed=string.Empty;
validator.IsValid(arg0, arg1, ref proposed);

我在测试中对验证器进行 stub ,并希望该 stub 更改引用的 proposed 字符串变量的内容。我尝试在 WhenCalled-Handler 中设置参数的值,但这没有任何效果。

validatorStub.Stub(x => x.IsValid(arg0, arg1, ref proposed))
.IgnoreArguments()
.WhenCalled(invocation =>
{
invocation.Arguments[2] = "123456";
}).Throw(new ValidationException(string.Empty));

这在 Rhino 中完全可行吗?不幸的是,我无法编辑该验证器...

编辑:感谢@FireAlkazar,我明白我必须更好地说明我的测试情况:

方法代码:

public class ClassUnderTest
{
public string Arg0{get;set;}
public string Arg1{get;set;}
public IValidator Validator {get;set;}

public bool Validate()
{
string proposal = string.Empty;
try
{
if (Validator.IsValid(Arg0, Arg1, ref proposal)) return true;
}
catch (ValidationException ex)
{
if (!string.IsNullOrEmpty(proposal))
{
// I want to test this section of code
}
}
return false;
}
}

测试代码:

[TestMethod]
public void Test_Validate_ValidatorProposes_ReturnsTrue()
{
string arg0 = "123456789";
string arg1 = "201208150030551ABC";
string prop = "123456";

ClassUnderTest testInstance = new ClassUnderTest();
testInstance.Arg0 = arg0;
testInstance.Arg1 = arg1;

IValidator validatorStub = MockRepository.GenerateStub<IValidator>();
validatorStub.Stub(x => x.IsValid(Arg<string>.Is.Equal(arg0),
Arg<string>.Is.Equal(arg1),
ref Arg<string>.Ref(Is.Anything(), prop).Dummy))
.Throw(new ValidationException(string.Empty));
testInstance.Validator = validatorStub;

bool actual = testInstance.Validate();

Assert.IsFalse(actual);
}

不过,当我逐步执行此操作时,我看到 ValidatorStub 抛出了我期望它抛出的异常,但从未设置 ref 参数。


编辑: This branch of RhinoMocks 使用较新版本的 CaSTLe Core,它解决了这个问题。作者非常友好地通过 Google 网上论坛告知了我这件事。

最佳答案

这个案例的文档Rhino Mocks 3.5 Out and Ref arguments

看起来你会有类似的东西

validatorStub.Stub(x => x.IsValid(Arg<string>.Is.Anything, Arg<string>.Is.Anything, ref Arg<string>.Ref(Rhino.Mocks.Constraints.Is.Anything(), "123456").Dummy));

string testRefValue = "";
validatorStub.IsValid("1", "2", ref testRefValue);
Assert.AreEqual("123456", testRefValue);

编辑:
对你的案子进行了调查。最终结果是否定的,在最新版本的 Rhino Mocks(3.6) 中不能这样做。原因是旧版本的 CaSTLe.DynamycProxy 中的错误,该错误被模拟使用。

证明:
fix bug: ref & out parameter can not received if Proxied Method throw an
此修复程序向 CaSTLe.Core/DynamicProxy/Generators/InvocationTypeGenerator.cs 添加行,如下所示:

bool hasByRefArguments = false;

//...

if (hasByRefArguments)
{
invokeMethodOnTarget.CodeBuilder.AddStatement(new TryStatement());
}

//...

为 Rhino.Mocks.dll 添加反射器,没有对 hasByRefArguments 情况的额外处理(参见同一文件 InvocationTypeGenerator.cs)。

关于c# - 使用 RhinoMocks 模拟引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16297617/

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