【发布时间】:2015-11-05 07:45:57
【问题描述】:
我正在对一段返回 JSON 的代码编写单元测试。它返回的类型是匿名类型,所以我想验证它上面的值,我只需将对象转换为 dynamic 来做我的断言。
但是,当我这样做时,我的构建会失败,但我没有任何错误消息。我能够在一个新的单元测试项目中用非常简单的代码重现这一点:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
请参阅下面的构建失败的屏幕截图
当我注释掉断言时构建成功:
相比之下,我在 LinqPad 5 beta(使用 Roslyn 编译器)中运行了以下代码,没有任何问题:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
是的
这里发生了什么?由于没有显示错误,我无法判断我是否错误地使用了dynamic,或者它是否因为dynamic 而找不到用于IsTrue() 的重载,或者这是一个错误在编译器中(尽管我非常怀疑这一点,但我没有任何证据表明我的代码有问题)。
关于过载问题,我尝试了Assert.IsTrue((bool)asDynamic.someValue);,但构建仍然失败,仍然没有错误消息。
根据@RonBeyer 的评论,我还尝试了更多的演员,例如以下无济于事:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
经过仔细检查,我发现输出窗口中列出了一个错误:
c:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42):错误 CS0656:缺少编译器所需的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
好的,VS2013报错比较好,我会根据这些来搜索:
好的,adding a reference to Microsoft.CSharp fixed the build error,但我会保留这个问题,因为这可能是 VS2015 的问题,(在我看来)应该解决。
【问题讨论】:
-
你确定这实际上是编译失败而不是链接失败?
-
你能试试
dynamic asDynamic = (dynamic)obj;吗?或者只是在断言中,注释掉动态并写Assert.IsTrue(((dynamic)obj).someValue);。 -
@RonBeyer 是的,我也尝试过这两种方法,但运气不好。
-
还有一个...
Assert.IsTrue((bool)asDynamic.someValue);? -
我在 VS2015 中尝试在测试方法中使用动态时遇到了同样的问题。构建失败,没有任何错误。添加 Microsoft.CSharp 引用后,构建成功。
标签: c# visual-studio-2015 roslyn