使用 FakeItEasy 测试 WebAPI 2 控制器未按预期工作
Testing WebAPI 2 Controllers with FakeItEasy not working as expected
我正在使用 xUnit 并尝试在下面对我的 WebAPI 控制器进行单元测试:
public IHttpActionResult Post(UserSearchRequest userSearchRequest)
{
int? numberOfRecords;
var users = this._userRepository.Search(userSearchRequest, out numberOfRecords).AsEnumerable();
return this.Ok(new { users, numberOfRecords });
}
我的测试如下:
[Fake]
public User User { get; set; }
[Fake]
public UserSearchRequest UserSearchRequest { get; set; }
[Fake]
public IRepository<User> UserRepository { get; set; }
[UnderTest]
public UsersSearchController UsersSearchController { get; set; }
public UsersSearchControllerTests()
{
Fake.InitializeFixture(this);
}
[Fact]
public void Get_WithUserSearchRequest_ExpectCallToUserRepositoryAndCorrectResultsReturned()
{
int? numberOfRecords = 0;
var users = new[] { this.User }.AsQueryable();
A.CallTo(() => this.UserRepository.Search(A<UserSearchRequest>.Ignored, out numberOfRecords))
.Returns(users)
.AssignsOutAndRefParameters(users.Count());
var actionResult = this.UsersSearchController.Post(this.UserSearchRequest);
var response = actionResult as OkNegotiatedContentResult<object[]>;
Assert.NotNull(response);
int? numberOfRecordsReturned = int.Parse(response.Content[1].ToString());
Assert.Equal(users.Count(), numberOfRecordsReturned);
}
当我调试到控制器时,对存储库的模拟调用似乎工作正常,但是当方法 returns 我的 actionResult 为空时。因此响应也为空等
现在我有一个类似的控制器和测试,它工作正常,主要区别在于控制器不是 return 一个对象数组,而是一个集合(即帐户,而不是多少条记录)找到)。
当 运行 它工作正常,所以在我看来,我觉得对象的模拟以及包装到对象数组中时响应如何处理它们有问题。
我是不是做错了什么?还是 FakeItEasy 有问题?
显然您的测试期望操作结果为 OkNegotiatedContentResult<object[]>
,但它实际上 returning OkNegotiatedContentResult<(anonymous type)>
。
假设您的测试是正确的,您的控制器应该 return 一个对象数组,而不是匿名对象。所以你应该改变这一行:
return this.Ok(new { users, numberOfRecords });
对此:
return this.Ok(new object[]{ users, numberOfRecords });
我正在使用 xUnit 并尝试在下面对我的 WebAPI 控制器进行单元测试:
public IHttpActionResult Post(UserSearchRequest userSearchRequest)
{
int? numberOfRecords;
var users = this._userRepository.Search(userSearchRequest, out numberOfRecords).AsEnumerable();
return this.Ok(new { users, numberOfRecords });
}
我的测试如下:
[Fake]
public User User { get; set; }
[Fake]
public UserSearchRequest UserSearchRequest { get; set; }
[Fake]
public IRepository<User> UserRepository { get; set; }
[UnderTest]
public UsersSearchController UsersSearchController { get; set; }
public UsersSearchControllerTests()
{
Fake.InitializeFixture(this);
}
[Fact]
public void Get_WithUserSearchRequest_ExpectCallToUserRepositoryAndCorrectResultsReturned()
{
int? numberOfRecords = 0;
var users = new[] { this.User }.AsQueryable();
A.CallTo(() => this.UserRepository.Search(A<UserSearchRequest>.Ignored, out numberOfRecords))
.Returns(users)
.AssignsOutAndRefParameters(users.Count());
var actionResult = this.UsersSearchController.Post(this.UserSearchRequest);
var response = actionResult as OkNegotiatedContentResult<object[]>;
Assert.NotNull(response);
int? numberOfRecordsReturned = int.Parse(response.Content[1].ToString());
Assert.Equal(users.Count(), numberOfRecordsReturned);
}
当我调试到控制器时,对存储库的模拟调用似乎工作正常,但是当方法 returns 我的 actionResult 为空时。因此响应也为空等
现在我有一个类似的控制器和测试,它工作正常,主要区别在于控制器不是 return 一个对象数组,而是一个集合(即帐户,而不是多少条记录)找到)。
当 运行 它工作正常,所以在我看来,我觉得对象的模拟以及包装到对象数组中时响应如何处理它们有问题。
我是不是做错了什么?还是 FakeItEasy 有问题?
显然您的测试期望操作结果为 OkNegotiatedContentResult<object[]>
,但它实际上 returning OkNegotiatedContentResult<(anonymous type)>
。
假设您的测试是正确的,您的控制器应该 return 一个对象数组,而不是匿名对象。所以你应该改变这一行:
return this.Ok(new { users, numberOfRecords });
对此:
return this.Ok(new object[]{ users, numberOfRecords });