我正在对返回JSON的代码编写单元测试。它返回的类型是一个匿名类型,所以我认为要验证它的值,我只是将对象转换为a 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
,不正确或者如果它不能找到超载使用IsTrue()
,因为的dynamic
,或者如果这是在编译器中的错误(虽然我很怀疑这个,我没有任何证据表明我的代码有问题)。
关于过载问题,我尝试过,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更好地报告了错误,我将根据以下内容进行搜索:
好的,添加对Microsoft.CSharp的引用可解决构建错误,但我将这个问题悬而未决,因为(在我看来)应该是VS2015的问题,应该解决。
dynamic asDynamic = (dynamic)obj;
吗?或者只是在断言中,注释掉动态并编写Assert.IsTrue(((dynamic)obj).someValue);
。
Assert.IsTrue((bool)asDynamic.someValue);
?