使用NancyFx进行测试时使用Post

时间:2017-02-23 03:13:02

标签: c# http-post automated-tests nancy

我有一个名为UserDto的简单对象,它看起来像:

public class UserDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我有一个南希控制器,创建用户的简化代码是,不提供路径信息,因为这一切都有效:

public void Create()
{
    try
    {
        var user = this.Bind<UserDto>
        // Create user using the user return variable
    }
    catch (Exception e)
    {
    }
}

当我手动测试时,所有这些代码都可以找到,但我想创建一些自动化测试来调用网址,就像我成功使用我的GET方法一样。

我的[TestMethod]测试代码的内部结构如下:

var bootstrapper = new DefaultNancyBootstrapper();
Browswer browser = new Browser(bootstrapper, to => to.Accept("application/json"));

UserDto newUser = new UserDto
{
    FirstName = "TestFirst",
    LastName = "TestLast"
};
string jsonUser = JsonConvert.SerializeObject(newUser);

var result = browser.Post("/DB/users/create, with =>
{
    with.JsonBody(jsonUser); 
         // or
    with.Body(jsonUser);
}

如果我使用“with.JsonBody(jsonUser),我的控制器代码抛出一个异常,我最终在catch块中出现错误:”无法绑定到类型UserDto“

如果我使用“with.Body(jsonUser),我的控制器代码不会抛出错误,但生成的用户对象与其所有成员一起存在,但该对象的所有成员都为null。用户显示FirstName&amp; LastName ,但它们都是空的。

我甚至尝试使用“with.Body(newUser);但是得到了编译时错误”无法从UserDto转换为字符串“。

我知道控制器代码有效,所以我的测试代码一定有问题。我显然没有正确地交出newUser对象。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

要解决这个问题,我必须在测试方法中使用以下代码:

var result = browser.Post("/DB/SQLite/users/create", with =>
{
    with.Header("Content-Type", "application/json");
    with.Body(jsonUser);
});

因此我错过了标题名称,这就完全不同了。