unit-testing - 我如何模拟 ServiceStack IHttpRequest

标签 unit-testing nunit moq servicestack

我正在尝试使用请求过滤器对将项目注入(inject) IHttpRequest.Items 的服务进行单元测试:

this.RequestFilters.Add((req, res, dto) =>
{
    // simplified for readability...
    var repo = container.Resolve<IClientRepository>();
    var apiKey = req.Headers["ApiKey"];

    // lookup account code from api key
    var accountcode = repo.GetByApiKey(apiKey);
    req.Items.Add("AccountCode", accountCode);
});

我的服务使用该字典项:

public class UserService : AppServiceBase
{
    public IUserServiceGateway UserServiceGateway { get; set; }

    public object Any(UserRequest request)
    {
        var accountCode = base.Request.Items["AccountCode"].ToString();
        var user = UserServiceGateway.GetUserByUsername(request.Name);

        return new UserResponse { User = user };
    }
}

我的测试需要以某种方式模拟请求,并插入该帐户代码项:

[Test]
public void ValidUsernameReturnUser()
{
    // arrange 
    var gateway = new Mock<IUserServiceGateway>();
    gateway.Setup(s => s.GetUserByUsername(It.IsAny<string>()))
            .Returns(new UserAccountDTO { Forename = "John", Surname = "Doe" });

    var service = new UserService {
        UserServiceGateway = gateway.Object,
        RequestContext = new MockRequestContext(),
        //Request = has no setter
    };

    // request is this case is null
    base.Request.Items.Add("AccountCode", "DEF456");

    // act
    var response = (UserResponse)service.Any(new UserRequest { Name = "test" });

    // assert
    Assert.That(response.Result, Is.Not.Null);    
}

服务本身接受模拟的 RequestContext,但不接受请求。因此测试失败。有更好的方法吗?

最佳答案

我认为这应该可以做到。

[Test]
public void ValidUsernameReturnUser()
{
    // arrange 
    var mockRequestContext = new MockRequestContext();
    //add items to Request
    mockRequestContext.Get<IHttpRequest>().Items.Add("AccountCode", "DEF456");
    var gateway = new Mock<IUserServiceGateway>();
    gateway.Setup(s => s.GetUserByUsername(It.IsAny<string>()))
            .Returns(new UserAccountDTO { Forename = "John", Surname = "Doe" });

    var service = new UserService {
        UserServiceGateway = gateway.Object,
        RequestContext = new MockRequestContext(),
    };

    // act
    var response = (UserResponse)service.Any(new UserRequest { Name = "test" });

    // assert
    Assert.That(response.Result, Is.Not.Null);    
}

关于unit-testing - 我如何模拟 ServiceStack IHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16063554/

相关文章:

java - 如何使用 JUnit 的 ErrorCollector 来检查发生了多少次失败?

ruby-on-rails - 如何根据开发数据库模式重新创建测试装置

c# - NunitTest 控制台输出

c# - 如何模拟实现多个接口(interface)的类

c# - 使用最小起订量单元测试框架编写测试

c# - 单元测试 c# 和测试私有(private)方法的问题

javascript - 如何使用 Jest 和 Enzyme 测试 getDerivedStateFromProps

java - 测试深度优先树

c# - 我应该使用回调还是引入公共(public)字段来帮助进行单元测试?

c# - NUnit 的 TestCaseAttribute 等效于 VS 单元测试框架