11

AAA 構文で Rhino Mocks 3.5+ を使用することに関する適切な情報を探し回っています。古いものと新しいものが混在しているため、使い方がわかりにくいブログがたくさんあります。

以前のバージョンで行われたように、Rhino Mocks AAA チート シートがあれば素晴らしいと思います。新しいバージョンを実際に使用するには、古いバージョンの Rhino についてすべて知っている必要がありますか? もし私が専門家であれば、Rhino のすべての機能を気に入ると思いますが、今のところ、情報を流しているだけです。ポインタや良いリンクは大歓迎です!

4

4 に答える 4

13

Rhino Mocks Arrange / Act / Assert (AAA) Syntax Quick Referenceを書きました。これには、 Ayende の Web サイト や他のいくつかのブログ から収集した、この構文スタイルに関する要約情報が含まれています。

于 2011-03-28T21:19:23.763 に答える
1

私の意見では、公式ドキュメントに精通していると思います。私の提案は、Rhino を使用してみることです。より具体的な問題が発生した場合は、SO または他の場所で解決策を探してください。Rhino モックの包括的なチート シートはないと思います。「Rhino Mocks を使ってこれとあれを行うにはどうすればよいか」と尋ねる方が運がいいと思います。

編集:まあ、AAA を対象とする場合、記録/再生を使用する必要はありません。AAA には、次の 3 つの手順が含まれます。

  • たとえば、モック化されたクラスの動作を設定するためのArrange 。

.

IOmicronDll mockWrapper = MockRepository.GenerateMock<IOmicronDll>();
mockWrapper.Expect(wrapper => wrapper.Lock(1, ref errors)).OutRef(string.Empty).Return(true).Repeat.Any();
mockWrapper.Expect(wrapper => wrapper.Exec(1, "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any();
mockWrapper.Expect(wrapper => wrapper.Exec("1", "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any();
Microsoft.Practices.Unity.UnityContainer c = new Microsoft.Practices.Unity.UnityContainer();
c.RegisterInstance<IOmicronDll>(mockWrapper);
  • Act、テストの実行を表します

    public Omicron(int deviceID)
    {
        try
        {
            if (g_Omicron == null)
                g_Omicron = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<CMEngineWrapper.IOmicronDll>();
            m_UniqueIdentifier = Guid.NewGuid();
            m_Logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<AdvAdmittance.Framework.ILogger>();
            m_ID = deviceID;
            GetConfiguration();
            g_InstancesCount++;
            m_PollThread = new Thread(new ThreadStart(DoPoll));
            m_PollThread.Start();
        }
    
  • そしてAssert、これは結果を検証することを表します

.

Assert.AreEqual("CMC 56", omicron.Type);
mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce());

おそらく、上記の例は最善ではありませんが、正しい方向に導くかもしれません。

于 2010-01-25T08:29:58.847 に答える
1

最初に、AAA の各 A の意味を理解していることを確認してください。ご存知かもしれませんが、回答を完全にするために私の作業定義を含めます。

  • 配置は、入力、モック/スタブ、テスト対象のメソッドを含むオブジェクトを設定する場所です
  • Actは、テスト対象のメソッドを呼び出す場所です
  • Assertは、物事が期待どおりに発生したか、または発生しなかったかを検証する場所です

テスト コードにコメントを入れて、これらのそれぞれについて考えるようにします。明確にするために例を示します。「古い」システムと「新しい」システムの 2 つのプロバイダ層クラスを使用するサービス層クラスがあるとします。古いものを新しいシステムにコピーするメソッドが、見つかった古いものごとに「CreateThing」メソッドを 1 回呼び出すことをテストしています。

[Test]
public void Should_create_new_Thing_for_each_old_Thing()
{
  // -----
  // arrange

  // hardcode results from old system provider
  List<Thing> oldThings = new List<Thing> { ... };

  // old system provider
  var oldProvider = MockRepository.GenerateStub<IOldSystemProvider>();
  oldProvider.Stub(m=>m.GetThings()).Return(oldThings);

  // new system provider
  var newProvider = MockRepository.GenerateStub<INewSystemProvider>();

  // service object
  var svc = new MyService(oldProvider, newProvider);

  //-----------
  // act
  var result = svc.CopyThings();

  //------------
  // assert
  oldThings.ForEach(thing => 
                    newProvider.AssertWasCalled(prov => prov.CreateThing(thing)));
}
于 2010-07-12T17:48:58.743 に答える
1

Ayende の AAA に関する最初の投稿から始めて、Ben Hall の AAA に関する素敵なブログ投稿をご覧になることをお勧めします。他の回答で言及されているすべての完全な参照を使用できるよりも...

于 2011-09-22T20:23:23.767 に答える