2016-08-12 65 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"); 

那麼結果是不爲空。第一個斷言通過。

但是我不能使用它,因爲我不確定如何檢查第二個聲明語句而不使用result.Content。我真的不確定在我的情況下要測試的最佳做法是什麼。

感謝任何幫助。

+0

我不明白'GetServiceId'部分;你寫過'GetCustId'是你試圖測試的方法......關於第一個斷言,你可以刪除它,第二個斷言如果結果爲空則會失敗......結果有什麼問題。 Content'? –

回答

1

你正在努力尋找"Johnny"(與「H」)時,你已經把"jonny"到您的模擬context從而方法總是返回null因您的if語句

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

添加到@ nizzik的答案,這是根據您的示例進行糾正,以避免出現簡單的錯誤,例如應將值存儲在變量中並重用它們以確保它們符合預期。

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); 
} 

這樣你就可以改變它們中的任何一個,並且測試應該按預期執行。