4

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

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

我在我的测试中存根验证器并希望该存根更改引用的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 参数。


编辑: RhinoMocks 的这个分支使用较新版本的 Castle Core,它解决了这个问题。作者很友好地通过 Google Groups 告知了我这一点。

4

1 回答 1

6

此案例的文档Rhino Mocks 3.5 Out 和 Ref 参数

看起来你会有类似的东西

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 中的一个错误,它被模拟使用。

证明:修复错误:如果代理方法抛出 此修复程序将行添加到Castle.Core/DynamicProxy/Generators/InvocationTypeGenerator.cs
,则无法接收 ref 和 out 参数,如下所示:

bool hasByRefArguments = false;

//...

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

//...

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

于 2013-04-30T11:39:33.683 回答