私のコードでは、次の呼び出しがあります。
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 グループを通じてこのことを知らせてくれました。