单元测试Web API控制器:获取结果错误

本文关键字:获取 结果 错误 控制器 Web API 单元测试 | 更新日期: 2023-09-27 18:02:09

我是ASP单元测试的新手。NET所以请原谅我在这方面的无知。我正在测试我的控制器。

这是我正在测试的控制器中的函数:

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

则结果不为空。第一个assert通过。

但是我不能使用它,因为我不确定如何在不使用result.Content的情况下检查第二个断言语句。我真的不确定在我的情况下测试的最佳实践是什么。

感谢您的帮助。

单元测试Web API控制器:获取结果错误

当您将"jonny"放入模拟context时,您正试图找到"Johnny"(带有'h'),因此方法总是返回null,因为您的if语句

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

添加到@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);
}
这样,您可以更改其中任何一个,并且测试应该按预期执行。