pologise如果这个问题已被问到,但我无法在任何地方找到答案。MOQ返回动态类型作为对象问题
我的问题是嘲笑使用MOQ返回方法返回动态类型的返回方法。我正在使用使用动态时间的第三部分库。 MOQ似乎将动态类型作为对象。
Mock<IFacebookHelper> mockFbHelp = new Mock<IFacebookHelper>();
mockFbHelp.Setup(x => x.Get("me")).Returns(new { email = "[email protected]", id="9999" });
方法在嘲笑的帮手。
public dynamic Get(string p)
{
var client = new FacebookClient(AccessToken);
return client.Get("me");
}
来自控制器的代码使用模拟结果。
_facebookHelper.AccessToken = accessToken;
dynamic result = _facebookHelper.Get("me");
int facebookId = int.Parse(result.id); //This errors as id doesn't exist.
基本上MOQ返回动态类型的对象,要求铸造的东西。
有谁知道如何解决这个问题?我假设这可能是因为MOQ没有在.NET 4中编码,因此不支持动态类型?
编辑
其实我不认为这是一个最小起订量问题,我创建了自己的模拟类,仍然有同样的问题。虽然我不清楚发生了什么,但我对动态类型很陌生。
编辑2 - 部分回答..问题无关MOQ所有
后其实这个问题似乎是由于动态类型在不同的组件被创建。虽然我用JObject类型了解了最初的问题,但我仍然想知道这一点。
namespace MyLib.Tools
{
public interface IDynTest
{
dynamic GetData();
}
}
namespace MyLib.Tools
{
public class DynTest : Effect.Tools.IDynTest
{
public dynamic GetData() {
return new { DynamicProperty = "hello" };
}
}
}
namespace Warrior.WebUI.Infrastructure
{
public class UseDynTest
{
private readonly IDynTest dynTest;
public UseDynTest(IDynTest dynTest)
{
this.dynTest = dynTest;
}
public string RetTest()
{
return dynTest.GetData().DynamicProperty;
}
}
}
namespace Warrior.Tests
{
[TestClass]
public class TestDynTest
{
[TestMethod]
public void TestMethod1()
{
//Mock<IDynTest> mockDynTest = new Mock<IDynTest>();
//mockDynTest.Setup(x => x.GetData()).Returns(new { DynamicProperty = "From Unit Test" });
DynTestProxy dynTestProxy = new DynTestProxy();
UseDynTest useTest = new UseDynTest(dynTestProxy);
string results = useTest.RetTest();
Assert.AreEqual("From Unit Test", results);
}
}
}
namespace Warrior.Tests
{
public class DynTestProxy:IDynTest
{
public dynamic GetData()
{
return (dynamic) new { DynamicProperty = "From Unit Test" };
}
}
}
存在由命名空间MyLib中,Warrior.WebUI和Warrior.Tests表示3项目。
由于它是测试失败,并显示错误.. “对象”中不包含关于“DynamicProperty” 发生上RetTest()
然而的定义,如果我只需移动DynTestProxy类进Warrior.WebUI项目一切工作正常。我猜在发送不同程序集的动态类型时会出现问题。
动态只是一个C#关键字,没有类型'动态'。如果你使用任何对象,通过一个动态的本地名称为'id'的属性/字段,它应该可以工作。 – Bond