2016-08-12 12 views
-1

私はASP.NETで単体テストを行っていますので、これについて私の知らないことを許してください。私はコントローラをテストしようとしています。ユニットテストWeb APIコントローラ:結果を取得する際のエラー

これは私がテストだ私のコントローラ内の関数である:

public IHttpActionResult GetCustId(string name) 
{ 
    var c_id = db.Customer.Where(s => (s.c_Name == name)); 

    if (c_id == null) 
    { 
     return null; 
    } 

    return Ok(c_id); 
} 

そして、これは私のユニットテストコードです:

public void GetName_ShouldReturnCorrectId() 
{ 
    var context = new TestSContext(); 
    context.Customers.Add(new Customer { c_ID = 1, c_Name = "jonny"}); 

    var controller = new CustomerController(context); 
    var result = controller.GetCustId("Johnny") as OkNegotiatedContentResult<Customer>; //ISSUE: Result is always NULL 

    Assert.IsNotNull(result); 
    Assert.AreEqual(1, result.Content.c_ID); 
} 

問題はここにある:

var result = controller.GetServiceId("Johnny") as OkNegotiatedContentResult<Customer> 

は常にNULLを返すためです。

var result = controller.GetCustId("Johnny"); 

その後、結果はnullではない:私はちょうどこれを使用する場合は

しかし...。そして、最初の断言はパスする。

しかし、result.Contentを使用せずに2番目のアサートステートメントをチェックする方法がわからないため、使用できません。私は実際に私の場合にベストプラクティスがテストされているかどうかはわかりません。

ありがとうございました。あなたが原因あなたの文

if (c_id == null) 
{ 
    return null; 
} 
+0

私は 'GetServiceId'についてのセクションを理解していません。あなたは 'GetCustId'がテストしようとしているメソッドであると書いています。最初のアサーションについてはそれを取り除くことができ、結果がnullの場合には2番目のアサーションで失敗します。コンテンツ '? –

答えて

1

あなたの値に変数を格納し、意図した通りにそれらを再利用するような単純な間違いを避けるために、あなたの例に基づいて正しい。

public void GetName_ShouldReturnCorrectId() { 
    //Arrange 
    var name = "Johnny"; 
    var expectedId = 1; 
    var context = new TestSContext(); 
    context.Customers.Add(new Customer { c_ID = expectedId, c_Name = name});  
    var controller = new CustomerController(context); 

    //Act 
    var result = controller.GetCustId(name) as OkNegotiatedContentResult<Customer>; 

    //Assert 
    Assert.IsNotNull(result); 
    Assert.AreEqual(expectedId, result.Content.c_ID); 
} 

こうすれば、いずれか1つを変更することができ、テストは期待通りに実行されます。

0

場合がある@ nizzikの答えに追加するには、あなたのモックcontextための方法常にnull返しにあなたが"jonny"を入れている(「H」で)"Johnny"を見つけようとしている

関連する問題