我有一个nUnit测试用例,断言从Facebook C#SDK返回的动态。有没有办法如何使用NUnit流畅的语法断言它。这是我正在寻找的简化示例:
// not working
var client = new FacebookClient(accessToken);
dynamic userInfo = client.Get("me");
Assert.That(userInfo, Is.Not.Null);
Assert.That(userInfo, Has.Property("id").Not.Null);
Assert.That(userInfo, Has.Property("name").Not.Null);
现在我只能通过直接指定'属性'进行测试
// working, but not fluent
var client = new FacebookClient(accessToken);
dynamic userInfo = client.Get("me");
Assert.That(userInfo, Is.Not.Null);
Assert.That(userInfo.id, Is.Not.Null);
Assert.That(userInfo.name, Is.Not.Null);
感谢您的回答。
答案 0 :(得分:2)
json对象是IDictionary< string.object>所以你可以使用它的方法。
var client = new FacebookClient(accessToken);
dynamic userInfo = client.Get("me");
var hasId = userInfo.ContainsKey("id");
我没有使用nunit流利的api,但我猜测可能有一些方法,比如Has.Key()
答案 1 :(得分:2)
prabir 给了我一个很好的建议。至少我可以将动态检查为 IDictionary 并使用 CollectionAssert.IsSubsetOf 进行测试。它不是100%涵盖我正在寻找的东西,但它是最接近的建议。
var client = new FacebookClient(accessToken);
dynamic userInfo = client.Get("me");
Assert.That(userInfo, Is.Not.Null);
var requiredDynamicProperties = new[] { "id", "name", "wtf" };
var dictionary = (userInfo as IDictionary<string, Object>);
CollectionAssert.IsSubsetOf(requiredDynamicProperties, dictionary.Keys);
// message will describe in details that no "wtf" found
答案 2 :(得分:0)
因此,如果userInfo是IDynamicMetaObjectProvider,我相信NUnit Has
将不起作用。是否可以修改NUnit约束API以使其工作取决于它的实现方式。如果使用反射实现,则可以使用dynamic invocation instead。但是,如果使用表达式实现它,它将无法使用真实的动态对象。