0

nSubstitute は初めてです。そして、コントローラークラスのテストメソッドを書いています。以下に示すように、Substitute クラスを持つ GetDefaultStateTest() という TestMethod があります。

[TestMethod]
    public void GetDefaultStateTest()
    {
        var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus);
        Assert.IsNotNull(_GetDefaultState.GetDefaultState());
    }

私のコントローラークラスは、以下のようにパラメーター化されたコンストラクターを持っているためです。

public class CustomerController : Controller
{
private readonly ICustomer _customer;
  public CustomerController(ICustomer customer)
  {
    _customer = customer;
  }

  public string GetDefaultState()
  {
        // Get default state from settings table
        List<tblSettings> settings = new List<tblSettings>();
     // Calling service method GetSettings
        settings = _customer.GetSettings();
        var defaultState = from setting in settings
                           where setting.Desc == "DefaultState"
                           select setting.Settings;
        string strState = "";
        foreach (var oState in defaultState)
        {
            strState = oState;
            break;
        } 
        return strState;
   }
}

テスト メソッドを実行すると、null 参照の問題が発生します。パラメータ ICustomer が null であるため

var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus);

この問題を解決する方法。

4

1 に答える 1

1

コントローラークラスをテストしている場合、それを置き換えたくない場合は、実際のコントローラークラスを使用する必要があります(そうしないと、偽のオブジェクトが「機能する」ことをテストすることになります:))。置き換えたい場所ICustomer、そのクラスの依存関係 (この場合は.

[TestMethod]
public void GetDefaultStateTest()
{
    var customer = Substitute.For<ICustomer>();
    var controller = new CustomerController(customer);
    Assert.IsNotNull(controller.GetDefaultState());
}

ICustomer.GetSettings()次に、コントローラーがそのデータで何をするかをテストできるように、メソッドを偽造することができます。

[TestMethod]
public void GetDefaultStateTestFromSettings()
{
    var customer = Substitute.For<ICustomer>();
    customer.GetSettings().Returns(somethingSensible);
    var controller = new CustomerController(customer);
    Assert.AreEqual(expectedDefaultState, controller.GetDefaultState());
}

余談ですが、ICustomer代替オブジェクトよりも実際のオブジェクト (たとえば、 の実際の実装) を使用する方が理にかなっている場合があります。これは、依存関係との相互作用がどの程度明確に定義されているか、テスト対象のシステムの境界を定義する場所、およびテスト対象のシステムが正しく機能していることをテストによってどの程度信頼できるかによって異なります。または、もっと簡単に言えば、テストを簡単かつ信頼できるものにします。:)

お役に立てれば。

于 2012-10-03T23:23:35.993 に答える