【问题标题】:How can I mock ServiceStack IHttpRequest如何模拟 ServiceStack IHttpRequest
【发布时间】:2013-04-17 15:02:13
【问题描述】:

我正在尝试使用请求过滤器对将项目注入 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,但不接受 Request。因此测试失败。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: unit-testing nunit moq servicestack


    【解决方案1】:

    我认为应该这样做。

    [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);    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多