我对如何编写单元测试有疑问,我的方法是:
[HttpGet]
[Route("api/CheckAvailability")]
public IHttpActionResult CheckAvailability()
{
var errorMessage = "DB not connected";
var dbAvailable = barcodeManager.CheckDBAvailability();
IHttpActionResult checkAvailability;
log.Debug($"DB available ? {dbAvailable}");
if (dbAvailable)
{
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fileVersionInfo.ProductVersion ;
log.Debug($"version = {version}");
checkAvailability = Ok(version);
}
else
{
checkAvailability = Content(HttpStatusCode.InternalServerError, errorMessage);
}
return checkAvailability;
}
并且我想测试Ok(version)结果。我试图编写此单元测试:
[TestMethod]
public void CheckAvailabilityTest()
{
var actualQR = barcodeControllerTest.CheckAvailability();
var contentVersion = actualQR as OkNegotiatedContentResult<string>;
Assert.AreNotEqual("", contentVersion.Content);
Assert.IsInstanceOfType(actualQR, typeof(OkResult));
}
但我收到此错误消息:
错误消息:Assert.IsInstanceOfType失败。预期类型:
`。<System.Web.Http.Results.OkResult>
。实际类型:<System.Web.Http.Results.OkNegotiatedContentResult
1 [System.String
[我知道我可以通过像使用Content
一样使用InternalServerError
方法重写操作方法的问题,并且我知道如何为Ok()
编写单元测试而没有返回任何字符串,但是我认为我更改了我的操作方法以编写单元测试是不对的,因为我的单元测试必须测试我的代码,现在我很想知道是否有一种方法可以检查ActionMethod是否返回带字符串且不带字符串的Ok()
使用Content
方法。
这是断言的问题,而不是受测成员。
[OkNegotiatedContentResult<T>
并非源自OkResult
] >>
由于您已经强制转换为所需的类型,所以另一种方法是检查是否为空
[TestMethod]
public void CheckAvailabilityTest() {
//Act
var actualQR = barcodeController.CheckAvailability();
var contentVersion = actualQR as OkNegotiatedContentResult<string>;
//Assert
Assert.IsNotNull(contentVersion); //if null, fail
Assert.AreNotEqual("", contentVersion.Content); //otherwise check other assertion
}