3

UUT (Unit Under Test) の依存関係としてデータベース操作オブジェクトがあります。したがって、UUT がデータベースの変更を引き起こす可能性のある他のメソッドを呼び出さないようにしたいので、厳密なモックとして作成したいと考えています。

サイのモックでは、次のことを行いました。

  1. db オブジェクトから strictmock を作成しました
  2. アレンジに.Expect句を作りました
  3. Assert で VerifyAllExpectations を呼び出しました

しかし、FakeItEasy でこれを実行したい場合、コードを複製せずに実行する方法が見つかりません。CallsTo()+MustHaveHappened() パーツをアレンジに入れようとしましたが、テストが失敗しました。CallsTo()+MustHaveHappened() 部分を Assert に入れると、予期しない呼び出しが厳密な偽物に対して行われたため、テストも失敗します。CallsTo 呼び出しを Arrange と Assert の両方に配置せずにこれを行うことはできますか?

4

2 に答える 2

6

@jimmy_keenからの回答は機能しますが(私も賛成しました)、FakeItEasyのより慣用的な使用法は次のとおりです。

// Arrange
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls
A.CallTo(() => service.PostData("data")).DoesNothing(); // allow a specific call

// Act
testedObject.CallService("data");

// Assert
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once);

- - アップデート - -

https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29145440で @blairconrad の助けを借りて、これが重複することなくこれを行うための最も適切な方法だと思います。

// Arrange
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls
var expectedCall = A.CallTo(() => service.PostData("data"));
expectedCall.DoesNothing(); // allow the call

// Act
testedObject.CallService("data");

// Assert
expectedCall.MustHaveHappened(Repeated.Exactly.Once);
于 2013-11-21T22:10:27.017 に答える
5

次の検証でそれを達成できます。

var service = A.Fake<IService>();

testedObject.CallService("data");

// verify your specific call to .PostData
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once);
// verify that no more than 1 call was made to fake object
A.CallTo(service).MustHaveHappened(Repeated.Exactly.Once); 

オーバーロードを使用すると、偽のオブジェクト メソッドのすべておよびすべてに対してA.CallTo(object)、一般的なセットアップ/検証を行うことができます。

于 2013-11-20T14:19:54.437 に答える