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