RhinoMocksを使用して、プロパティのゲッター値をスタブしようとしています。プロパティは、ゲッターアクセスのみのインターフェイスの一部として定義されています。
ただし、「無効な呼び出し、最後の呼び出しが使用されたか、呼び出しが行われていません(仮想(C#)/オーバーライド可能(VB)メソッドを呼び出していることを確認してください)」というエラーが表示されます。これは、スタブしているプロパティが仮想ではないことを意味している可能性があることを理解しています。ただし、これはインターフェイスの一部であり、それがこのエラーが発生する理由かどうかはわかりません。
以下はコードスケルトンです。 「stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();」という行のコメントを解除すると、「プロパティは読み取り/書き込みが必要です」という新しいエラーが発生します。 SOで検索し、 this ページを見つけました。しかし、提案された解決策は役に立ちません。何か考えはありますか?
public interface IStore {
string StoreDeviceID {get;}
//other methods
}
public static class Store {
private IStore Repository;
public void SetRepository(IStore rep){
Repository = rep;
}
public StoredeviceID {
get{
return Repository.StoreDeviceID;
}
}
//other methods
}
public class TestClass {
[Test]
public void TestDeviceID() {
var stubRepository =
MockRepository.GenerateStub<IStore>();
Store.SetRepository(stubRepository);
//stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();
SetupResult.For(stubRepository.StoreDeviceID).Return("test");
Assert.AreSame(Store.StoreDeviceID, "test");
}
}
これは読み取り専用のプロパティであるため、次のように言う必要があります。
stubRepository.Stub(x => x.StoreDeviceID).Return("test");
通常、スタブでは、プロパティは通常のC#プロパティと同じように使用されます。したがって、非読み取り専用プロパティの場合、次のようになります。stubRepository.someProperty = "test";
また、メソッドがモックであるかスタブであるかに関係なく、特定の方法で動作するように設定する場合は、常に次のように言うことに注意してください。
stubRepository.Stub(x => x.someMethod()).Return("foo");
スタブは、ユニットテストに必要な依存関係を提供するためにありますが、検証を実行するためにはありませんありません。それがモックの目的です。
特定の方法で動作する依存関係を提供する場合は、スタブを使用します。特定の依存関係が正しく相互作用したことを確認する場合は、モックを使用します。
(傑出した)から Rhino Wiki :
モックは、期待を設定できるオブジェクトであり、期待されるアクションが実際に発生したことを確認します。スタブは、テスト対象のコードに渡すために使用するオブジェクトです。期待値を設定できるため、特定の方法で動作しますが、それらの期待値が検証されることはありません。スタブのプロパティは自動的に通常のプロパティのように動作し、期待値を設定することはできません。
テスト対象のコードの動作を検証する場合は、適切な期待値を持つモックを使用して、それを検証します。特定の方法で動作する必要があるかもしれないが、このテストの焦点ではない値を渡すだけの場合は、スタブを使用します。
重要:スタブによってテストが失敗することはありません。
スタブを使用して次のことを実行できます。
stubRepository.Stub(x => x.StoreDeviceID).Return("test");
これにより、StoreDeviceIDのゲッターへの呼び出しに対して「テスト」が返されます。