4

これがばかげた質問であるなら許してください、しかし私はあざけるのがかなり新しいです、そしてそれについて頭を悩ませようとしています。

メソッドに必要なスタブを使用する単体テスト(組み込みのVisual Studio 2010 Professionalテスト機能を使用)がいくつかあります。スタブを作成し、いくつかのプロパティとメソッドのデフォルトの戻り値を設定しましたが、すべて正常に機能します。スタブを設定する静的クラスがあり、これはスタブTestInitializeを設定するメソッドで使用されます...

public static AppointmentReminderProviderInterface GetMockProvider() {
  AppointmentReminderProviderInterface provider = MockRepository.GenerateStub<AppointmentReminderProviderInterface>();
  provider.Stub(p => p.ContactName).Return(MockProviderContactName);
  provider.Stub(p => p.ContactEmail).Return(MockProviderContactEmail);
  return provider;
}

MockProviderContactNameおよびMockProviderContactEmailは、プロバイダーのデフォルトデータを含むローカル文字列プロパティであることに注意してください。物事がデフォルトのデータで期待どおりに機能するかどうかを確認するユニットtstsは、すべて正常に合格します。

ただし、これらのプロパティの1つにダフデータが含まれている場合に何が起こるかをテストしたいと思います。これをスタブに設定するだけでいいと思ったのですが、うまくいきません。テストメソッドには次の行が含まれています...

_provider.Stub(p => p.ContactEmail).Return("invalid");
Debug.WriteLine("Provider email: <" + _provider.ContactEmail + ">");

は、 「無効」を返すようにプロパティをDebug.WriteLine()設定したにもかかわらず、デフォルトの電子メールアドレスを返すことを示しています。ContactEmailこれにより、例外がスローされることを期待しているため、テストが失敗しますが、失敗しません。

このプロパティの戻り値を変更できない理由を誰かが知っていますか?

助けてくれてありがとう。

4

2 に答える 2

5

トリッキーですが機能するソリューションとして、ここでDoハンドラーを使用することをお勧めします。これにより、スタブメソッド/プロパティのロジックを実装できます。

例を参照してください:

var providerContactEmail = "Email1";

provider
    .Stub(p => p.ContactEmail)
    .Do((Func<string>)(() => providerContactEmail));
// here provider.ContactEmail returns "Email1"

providerContactEmail = "Email2";
// now provider.ContactEmail returns "Email2"

しかし、私の意見では、テストの途中で戻り値を変更しないことを可能にする解決策を見つけることができれば、はるかに優れています。:)

于 2012-12-18T19:27:52.560 に答える
1

変更してみる

_provider.Stub(p => p.ContactEmail).Return("invalid");

_provider.ContactEmail = "invalid";

ContactEmail にセッターがあると仮定すると、これは機能するはずです。これで問題が解決しない場合は、Alexander Stepaniuk のアドバイスに従い、テストをリファクタリングして、同じスタブに複数の動作を追加しないようにします。それはあなたの問題と関係があると思います。

于 2012-12-18T00:41:22.737 に答える