相关疑难解决方法(0)

执行测试时出错,如果使用CreateResponse扩展方法返回Azure Function HttpResonseMessage

我的Azure功能代码如下所示

public static class MyHttpTriggerFunction
{       
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        // some business logic

        if (valid)
        {
            return req.CreateResponse(HttpStatusCode.OK, true);
        }
        else
        {
             return req.CreateResponse(HttpStatusCode.BadRequest, "some error message");
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试项目中,我正在阅读如下结果:

var result = await MyHttpTriggerFunction.Run(req, log).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

执行该函数后,当它尝试在结果变量中返回响应时,测试方法失败并出现异常.

**

System.InvalidOperationException:请求没有关联的配置对象,或者提供的配置为null.

**

我确保测试项目具有相同的System.Net.Http.HttpRequestMessageExtensiondll.

如果我更改功能代码不使用CreateResponse扩展方法(此扩展方法来自VS 2017模板的代码)并返回如下所示的响应,我会在测试方法中获得响应并且测试用例运行正常.

var res = new HttpResponseMessage();
if (valid)
{
    res.StatusCode = HttpStatusCode.OK;
    res.Content = new ObjectContent<bool>(true, new JsonMediaTypeFormatter());        
    return res;
}
else …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing azure azure-functions visual-studio-2017

25
推荐指数
2
解决办法
7475
查看次数

单元测试WebApi2传递标题值

我正在使用WebApi2开展项目.在我的测试项目中,我正在使用Moq和XUnit.

到目前为止,测试一个api已经很简单了

  [Fact()]
    public void GetCustomer()
    {
        var id = 2;

        _customerMock.Setup(c => c.FindSingle(id))
            .Returns(FakeCustomers()
            .Single(cust => cust.Id == id));

        var result = new CustomersController(_customerMock.Object).Get(id);

        var negotiatedResult = result as OkContentActionResult<Customer>;
        Assert.NotNull(negotiatedResult);
        Assert.IsType<OkNegotiatedContentResult<Customer>>(negotiatedResult);
        Assert.Equal(negotiatedResult.Content.Id,id);
    }
Run Code Online (Sandbox Code Playgroud)

现在我正在进行一些有点复杂的事情,我需要从请求标头中访问值.

我通过扩展IHttpActionResult创建了自己的Ok()结果

   public OkContentActionResult(T content,HttpRequestMessage request)
    {
        _request = request;
        _content = content;
    }
Run Code Online (Sandbox Code Playgroud)

这允许我有一个小助手从请求中读取标头值.

 public virtual IHttpActionResult Post(Customer customer)
    {
        var header = RequestHeader.GetHeaderValue("customerId", this.Request);

        if (header != "1234")
Run Code Online (Sandbox Code Playgroud)

我是怎么想用虚拟请求设置Moq的?

我花了最后一个小时左右的时间寻找一个允许我用webapi做这个的例子但是我似乎无法找到任何东西.

到目前为止.....我很确定api的错误,但我有

      // arrange
        var context = new Mock<HttpContextBase>();
        var request = new Mock<HttpRequestBase>(); …
Run Code Online (Sandbox Code Playgroud)

moq xunit xunit.net asp.net-web-api asp.net-web-api2

2
推荐指数
1
解决办法
6201
查看次数