2017-09-07 10 views
0

テスト中に問題が発生しています。私はいくつかの他のオブジェクトを持つ巨大な方法であり、今RefreshStrategyは、選択した人によると、データベースから、いくつかの戦略を取り、更新_lstStrategiesセッター内でプライベートメソッドをテストするにはどうすればいいですか?

public class ViewModel { 

.... 

    public string Person 
    { 
     get 
     { 
      return _person; 
     } 
     set 
     { 
      if (_person != value) 
      { 
       _person = value; 
       RefreshStrategy(); 
       OnPropertyChanged(); 
       Somefield = string.Empty; 
      } 
     } 
    } 

    public BindingList<string> Strategies 
    { 
     get 
     { 
      return _lstStrategies; 
     } 
    } 

これらのもののようにクラスとプロパティを持っています。今、すべてが実行時に正常に動作しているが、私はそれをテストしようとすると、私が問題にしている:私はPerson = "Test"を設定すると、明らかにRefreshStrategy()

[TestClass] 
public class ViewModelTest 
{ 

    private ViewModel _viewobj; 

    public ViewModelTest() 
    { 

     _viewobj = new ViewModel(); 
    } 


    [TestMethod] 
    public void TestStrategies() 
    { 
     _viewobj.Person = "Test"; 

     Assert.AreEqual("AAAA", _viewobj.Strategies[0]); 

    } 

private void RefreshStrategies() 
    { 
     Logger.log(Logger.INFO, $"GOT STRATEGIES"); 
     // Reload these default options every time the form loads, in case some applications settings have been changed 
     if (String.IsNullOrEmpty(Trader) && !SettingsMgr.IsCompositePortfolio) 
     { 
      Person = Utility.SettingsMgr.PORTFOLIO_CODE; 
     } 
     if (!String.IsNullOrEmpty(Person)) 
     { 

      string fund = _portfolios.Where((tt) => tt.PersonId == Person).Select(tt => tt.Fund).FirstOrDefault(); 
      if (!string.IsNullOrEmpty(fund)) 
      { 
       fund = "X"; 
      } 
      var profitCenters = new List<ProfitCenter>(); 
      try 
      { 
       Logger.log(Logger.INFO, $"Try to load strategies for {Person} {fund}"); 

       var pci = DataMgr.getInstance().GetProfitCenterInfo(Person, fund); 
       Logger.log(Logger.INFO, $"HERE !!!"); 
       profitCenters = pci?.profitCenters; 

      } 
      ...... 

     } 

と呼ばれるが、すべてのオブジェクトの内側にはnullであり、それは」例外が発生します。.. .nu​​llオブジェクト参照を参照解除しようとしました "。単純なLoggerが上がり始めています。もし私がコメントアウトしていれば、それはUtility.Settingのようなものです。

単純な変数のテストのようにこのクラスの簡単なテストを行うと、テストプロジェクトでは問題ありません。

私は間違っていますか?方法全体を嘲笑していますか?それがプライベートならどうですか?

+1

RefreshStrategy関数を投稿してください。 – w0051977

+5

'RefreshStrategy'を別のクラスに移動します。それのためのインターフェイスを作成し、次にインターフェイスを単に模擬することができます。 – FCin

+0

@ Nkosi私の疑問は、私がそれを模倣する必要があるかどうかを理解することです。それは、テスト中に何かが見つからないためです。 – MaxMarcucci

答えて

1

これは行くための一つの方法である:それはDependency Injectionでより良い動作しますが、私はかどうかを知りません。もちろん、

private ViewModel _viewModel; 

[Test] 
public void Test() 
{ 
    _viewModel = new ViewModel 
    { 
     StrategyManager = new Mock<IStrategyManager>().Object, 
     Person = "whatever" 
    }; 

} 

public interface IStrategyManager 
{ 
    void RefreshStrategy(); 
} 
public class StrategyManager : IStrategyManager 
{ 
    public void RefreshStrategy() 
    { 
     // Doesn't matter what is in here. 
    } 
} 
public class ViewModel { 
    public IStrategyManager StrategyManager = new StrategyManager(); 

    public string Person 
    { 
     get 
     { 
      return _person; 
     } 
     set 
     { 
      if (_person != value) 
      { 
       _person = value; 
       StrategyManager.RefreshStrategy(); 
       OnPropertyChanged(); 
       Somefield = string.Empty; 
      } 
     } 
    } 
} 

あなただけの財産を模擬する必要がありますあなたはそれを使用しています。その後、プロパティをコンストラクタインジェクションに置き換えることができます。

これにより、IStrategyManagerという異なる実装を使用することもできます。これは素晴らしい方法です。このアプローチの弱点は、追加のクラスとインタフェースです。

関連する問題