在 Xunit 中测试 id 是否大于 0
Test if id is greater than 0 in Xunit
任何人都可以帮我为下面的单元测试编写第二个断言吗?实际上我想测试 CategoryId 是否大于 0 并且我想使用我的响应数据(由于 Identity 列,CategoryId 在这里自动生成)
[Fact]
public async Task PostValidObjectReturnsOkResult()
{
//Arrange
Mock <ICategoryService> m = new Mock <ICategoryService>();
CategoryDTO myData = new CategoryDTO()
{
CategoryName = "Items"
};
m.Setup(repo => repo.CreateCategory(myData));
CategoryController c = new CategoryController(m.Object);
//Act
ActionResult response = await c.Post(myData);//response data
//Assert
Assert.IsType <OkObjectResult>(response);
}
我尝试了以下方法但没有用:
Assert.NotEqual(0,(response.Value as CategoryDTO).CategoryId);
Assert.True(((response.Value as CategoryDTO).CategoryId) > 0);
Assert.IsType
将 return 转换类型。尝试:
var okResult = Assert.IsType<OkObjectResult>(response);
Assert.True(okResult.Value.CategoryId > 0);
看起来您要测试的是将值从 ICategoryService
赋值回 CategoryDTO
对象的行为。在这种情况下,ICategoryService
的模拟实现将需要提供与具体实现相同的结果。看起来您正在使用 Moq,为了实施检查,您可以 use a callback 检查以下内容:
var expectedCategoryId = 42;
m.Setup(repo => repo.CreateCategory(myData))
.Callback(() => myData.CategoryId = expectedCategoryId);
// The rest of the testing code
Assert.Equal(expectedCategoryId, resultValue.CategoryId);
如果传递到服务中的对象与在控制器的 OK 响应中 returned 的对象相同,那么您可能需要将测试调整为 verify the expectations of the mock service:
// The rest of the testing code
m.VerifyAll();
此外,@Jonesopolis 建议不要使用 as
运算符进行类型转换,您应该使用 Assert.IsType<T>
的 return 结果。稍微调整一下他们的代码,这应该会简化您的测试逻辑:
// The rest of the testing code
var okObjectResult = Assert.IsType<OkObjectResult>(response);
var resultValue = Assert.IsType<CategoryDTO>(okObjectResult);
Assert.True(resultValue.CategoryId > 0, "Result value does not have CategoryId assigned");
另请注意,我在 Assert.True
检查旁边添加了一条消息。这允许测试框架在测试失败时给出更好的反馈。
我终于这样修好了:
var okResult = Assert.IsType<OkObjectResult>(response);
Assert.NotEqual(0, (okResult.Value as CategoryDTO).CategoryId);
我也修改了这行代码:
m.Setup(repo => repo.CreateCategory(myData));
添加到以下代码中,因为我们需要指定 Returns() 以便为您提供 CategoryId
的一些随机数
m.Setup(i => i.CreateCategory(It.IsAny<CategoryDTO>())).Returns(() => Task.FromResult(myData));
任何人都可以帮我为下面的单元测试编写第二个断言吗?实际上我想测试 CategoryId 是否大于 0 并且我想使用我的响应数据(由于 Identity 列,CategoryId 在这里自动生成)
[Fact]
public async Task PostValidObjectReturnsOkResult()
{
//Arrange
Mock <ICategoryService> m = new Mock <ICategoryService>();
CategoryDTO myData = new CategoryDTO()
{
CategoryName = "Items"
};
m.Setup(repo => repo.CreateCategory(myData));
CategoryController c = new CategoryController(m.Object);
//Act
ActionResult response = await c.Post(myData);//response data
//Assert
Assert.IsType <OkObjectResult>(response);
}
我尝试了以下方法但没有用:
Assert.NotEqual(0,(response.Value as CategoryDTO).CategoryId);
Assert.True(((response.Value as CategoryDTO).CategoryId) > 0);
Assert.IsType
将 return 转换类型。尝试:
var okResult = Assert.IsType<OkObjectResult>(response);
Assert.True(okResult.Value.CategoryId > 0);
看起来您要测试的是将值从 ICategoryService
赋值回 CategoryDTO
对象的行为。在这种情况下,ICategoryService
的模拟实现将需要提供与具体实现相同的结果。看起来您正在使用 Moq,为了实施检查,您可以 use a callback 检查以下内容:
var expectedCategoryId = 42;
m.Setup(repo => repo.CreateCategory(myData))
.Callback(() => myData.CategoryId = expectedCategoryId);
// The rest of the testing code
Assert.Equal(expectedCategoryId, resultValue.CategoryId);
如果传递到服务中的对象与在控制器的 OK 响应中 returned 的对象相同,那么您可能需要将测试调整为 verify the expectations of the mock service:
// The rest of the testing code
m.VerifyAll();
此外,@Jonesopolis 建议不要使用 as
运算符进行类型转换,您应该使用 Assert.IsType<T>
的 return 结果。稍微调整一下他们的代码,这应该会简化您的测试逻辑:
// The rest of the testing code
var okObjectResult = Assert.IsType<OkObjectResult>(response);
var resultValue = Assert.IsType<CategoryDTO>(okObjectResult);
Assert.True(resultValue.CategoryId > 0, "Result value does not have CategoryId assigned");
另请注意,我在 Assert.True
检查旁边添加了一条消息。这允许测试框架在测试失败时给出更好的反馈。
我终于这样修好了:
var okResult = Assert.IsType<OkObjectResult>(response);
Assert.NotEqual(0, (okResult.Value as CategoryDTO).CategoryId);
我也修改了这行代码:
m.Setup(repo => repo.CreateCategory(myData));
添加到以下代码中,因为我们需要指定 Returns() 以便为您提供 CategoryId
的一些随机数m.Setup(i => i.CreateCategory(It.IsAny<CategoryDTO>())).Returns(() => Task.FromResult(myData));