NUnit是否支持C#dynamics的流畅语法?

时间:2011-09-12 16:14:25

标签: c# unit-testing dynamic nunit facebook-c#-sdk

我有一个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);

感谢您的回答。

3 个答案:

答案 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。但是,如果使用表达式实现它,它将无法使用真实的动态对象。