很抱歉如果这个问题已经被问过了,但我无处找到答案。
我的问题是在使用MOQ模拟返回一个动态类型的方法时。我正在使用一个使用动态类型的第三方库。MOQ似乎将动态类型强制转换为对象。
Mock<IFacebookHelper> mockFbHelp = new Mock<IFacebookHelper>();
mockFbHelp.Setup(x => x.Get("me")).Returns(new { email = "test@test.com", 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编写的,因此不支持动态类型?
编辑:实际上,我认为这不是一个MOQ问题,因为我创建了自己的模拟类,但仍然遇到了同样的问题。虽然我对动态类型还不太熟悉,所以不确定发生了什么。
编辑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" };
}
}
}
有3个项目被命名空间MyLib, Warrior.WebUI和Warrior.Tests所表示。
由于测试失败并出现错误,'object' does not contain a definition for 'DynamicProperty',这是在RetTest()函数中发生的。
然而,如果我将DynTestProxy类简单地移动到Warrior.WebUI项目中,一切都正常工作。 我猜想,在不同程序集之间发送动态类型时会出现问题。