2016-10-21 4 views
0

私はUnit TestingとMoqを初めて使うので、私の方法や理解が完全に間違っていたら、私を助けてください。Moqの設定でnullが発生する

私はロジックメソッドをテストしています。私はロジックをコメントアウトしましたが、それは「モデル」内のいくつかの値をチェックし、問題がある場合はそれを返します。私たちが見ている場合、問題はありません。 NUnitのとMOQを、使用して

 public ReplyDto SaveSettings(SnowballDto model) 
     { 

      // Some logic here that reads from the model. 

      var result = _data.SaveSettings(model); 
      return result; 
     } 

私のテストでは、次のようになります。

各試験において、
_logic = new SnowballLogic(mockSnowballData.Object, mockLog.Object); 

      mockSnowballData 
       .Setup(x => x.SaveSettings(SnowballDto_Good)) 
       .Returns(new ReplyDto { 
        IsSuccess = true, 
        Message = "Saved", 
        ReplyKeyID = 1 
       }); 

が、私は私が使うことになるものを設定し、民間セットアップ関数を呼び出します。

private void SetupData() 
     { 
      SnowballDto_Good = new SnowballDto { 
       FirstPaymentDate = DateTime.UtcNow, 
       ID = 1, 
       OrderedIDPriority = new List<int>(), 
       SnowballTypeID = 1, 
       TargetPayment = 1000 
      }; 

      DebtDtoList_ThreeDebt.Clear(); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 1, Description = "Debt 1", ManualSnowballPriority = 1, MinimumMonthlyPaymentAmount = 140, OpeningBalance = 5000, RunningData = new DebtRunningDto { Balance = 5000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 10 }); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 2, Description = "Debt 2", ManualSnowballPriority = 2, MinimumMonthlyPaymentAmount = 90, OpeningBalance = 1600, RunningData = new DebtRunningDto { Balance = 1600 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 15 }); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 3, Description = "Debt 3", ManualSnowballPriority = 3, MinimumMonthlyPaymentAmount = 300, OpeningBalance = 9000, RunningData = new DebtRunningDto { Balance = 9000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 20 }); 


     } 

だから、MOQの私の理解は、私は常に真IsSuccess =で新しいReplyDtoを返し、SaveSettings 『methidと呼ばれ、『SnowballDto_Good』オブジェクトが渡された「SnowballDataクラスのは、ときに』。言っていることです私は電話をかけるとき、そのため

、:

var result = _data.SaveSettings(model); 

それは

しかし、私はブレークポイントを置くとき、真IsSuccess =とReplyDtoを返す必要があります私が 'SaveSettings'を呼び出すと、nullを常に返します。

私は私の設定を変更する場合:

.Setup(x => x.SaveSettings(It.IsAny<SnowballDto>())) 

テストは合格。本当のSnowballDtoを与えると、なぜそれがnullを返すのですか?

+2

これは参照する引数を比較しています –

+1

セットアップで使用したのと同じオブジェクトを渡していますか? – Nkosi

+0

はい、私は同じオブジェクトを渡しています。 – Craig

答えて

0

だけでなく、それはあなたがあなたのテストMOQの設定で

var result = _data.SaveSettings(model);

の「行為」の部分にmodel命名SnowballDtoのインスタンスを渡しているようだ、しかし、あなたはそれが新しいを返すように設定しますインスタンスSnowballDto_GoodSaveSettingsに指定されている場合にのみ、ReplyDtoとなります。他のすべてのケースでは、メソッドのモックは設定されておらず、緩いモーキング戦略(デフォルト)の場合は、SaveSettingsの戻り値のデフォルト値が返されます。この場合、nullです。

あなたがIt.IsAny<SnowballDto>を使用しているときは、基本的にそのインスタンスSnowballDto_Goodがそれに渡されますが、そのタイプの任意のインスタンスだけでなく、新しいインスタンスを返すようにSaveSettingsを設定するにはMOQを語っています。あなたがする必要がどのような

は、次のようにあなたのテストのあなたの「行為」の部分を変更することです:

var result = _data.SaveSettings(SnowballDto_Good);

正しいインスタンスが渡されますので、それは、あなたのオリジナルのモックの設定で動作しますSaveSettings

これは私がMockBehavior.Strictを使用して私のモックをインスタンス化したい理由です。

ヌルを返す代わりに、モックを正しく構成しなかったことを示す例外がスローされます。

これが役に立ちます。

関連する問題