单元测试&动态noob在这里...
我意识到这不是解析JSON的最佳方法。我只是试图围绕动力学以及如何为它们添加测试。
我正在使用此anwser的question帮助JSON解析JSON反序列化到C#动态对象。
以下是一个示例JSON字符串:
string jsonText = "{ name: \"Google\", uri: \"http://www.google.com\" }";
假设我有一个名为Site的类,它有一个名称和uri属性,我想用我从上面的JSON字符串反序列化的动态数据实例化它:
dynamic data = jss.Deserialize(jsonText, typeof(object)) as dynamic;
var account = new Site{
name = data.sid,
uri = data.uri
};
这会将'string'上的运行时绑定程序异常抛出到'System.Uri'。
我认为这是学习单元测试的好机会(一直想要)。我会写这个测试,确认失败,然后让它工作。这是测试:
[TestMethod()]
public void UriDynamicTest()
{
Site target = new Site();
dynamic uri = "http://www.google.com";
var expected = uri;
Uri actual;
target.uri = expected;
actual = target.uri;
Assert.AreEqual(expected, actual);
}
这就是我被困住的地方。测试按预期编译,无法按预期运行。我的下一个合乎逻辑的反应是写一个说是的测试,如果你给我一个Uri的字符串,我会失败:
[TestMethod()]
[ExpectedException(typeof(RuntimeBinderException), "Cannot implicitly convert type 'string' to 'System.Uri'")]
public void UriThrowsExceptionIfInvalidData()
{
Site target = new Site();
dynamic uri = "http://www.google.com";
var expected = uri;
Uri actual;
target.uri = expected;
actual = target.uri;
Assert.AreEqual(expected, actual);
}
但是现在我所做的就是验证我已经知道的东西。我不确定这对我有什么帮助,因为测试通过了。我正在寻找那个让我重新编写代码以进行某种类型检查的时刻,以确保我要设置的Uri是一个Uri。我确信在我编写类型检查代码并问自己为什么要使用动力学时,还会有另一个时刻到来?
我正在寻找一种正确的方法来测试我的Site.Uri在通过Uri时是否满意,并且当它没有通过Uri时不高兴。
答案 0 :(得分:1)
我正在寻找合适的测试方法 我的Site.Uri很开心 通过了一个Uri,当它没有时就不开心了 没有通过Uri。
您刚回答了自己的问题..编写一个测试,测试它是否按预期失败(正如您所做的那样),并且第二个测试它的测试将在给定正确类型时按预期工作。
[TestMethod()]
public void UriDynamicTestWorksWithCorrectParameter()
{
Site target = new Site();
dynamic uri = new Uri("http://www.google.com"); // note: correct type created here
var expected = uri;
Uri actual;
target.uri = expected;
actual = target.uri;
Assert.AreEqual(expected, actual);
}
您确定dynamic
是您需要的,为什么不只是var
?
在你的代码中,uri参数不是动态的(它只是一个字符串),data
是动态变量。因此,您正在测试代码的错误部分可以处理成为动态变量。