我正在使用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);
}
当我调试到控制器时,对存储库的模拟调用似乎工作正常,但是当方法返回时,我的actionResult为null。因此响应也是null等。
现在我有一个类似的控制器和测试,并且工作正常,主要区别在于控制器不返回一个对象数组而是一个集合(即帐户但没有找到多少记录)。
当运行它时它工作正常,所以在我看来,我觉得对象的模拟有些问题,以及当包装到对象数组中时它们如何被响应处理。
我在这里做错了吗?或者FakeItEasy存在问题吗?
答案 0 :(得分:3)
显然,您的测试期望操作结果为var q = @"this ""is"" how you do it.";
,但它实际上会返回OkNegotiatedContentResult<object[]>
。
假设您的测试正确,您的控制器应该返回一个对象数组,而不是一个匿名对象。所以你应该改变这一行:
OkNegotiatedContentResult<(anonymous type)>
到此:
return this.Ok(new { users, numberOfRecords });