使用FakeItEasy测试WebAPI 2控制器无法按预期工作

时间:2017-03-24 16:02:46

标签: c# unit-testing asp.net-web-api xunit.net fakeiteasy

我正在使用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存在问题吗?

1 个答案:

答案 0 :(得分:3)

显然,您的测试期望操作结果为var q = @"this ""is"" how you do it."; ,但它实际上会返回OkNegotiatedContentResult<object[]>

假设您的测试正确,您的控制器应该返回一个对象数组,而不是一个匿名对象。所以你应该改变这一行:

OkNegotiatedContentResult<(anonymous type)>

到此:

return this.Ok(new { users, numberOfRecords });