MOQ返回动态类型作为对象问题 - c#

如果有人问过这个问题,请向我致歉,但我找不到任何答案。

我的问题是使用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未在.NET 4中编码,因此不支持动态类型吗?

编辑

实际上,我不认为这是起订量的问题,因为我创建了自己的模拟类并且仍然遇到相同的问题。我是动态类型的新手,但是不确定是怎么回事。

编辑2-已回答部分。毕竟,与起订量无关的问题

实际上,问题似乎是由于动态类型是在其他程序集中创建的。尽管我使用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项目中,则一切正常。我猜想跨不同的程序集或某些东西发送动态类型时会出现问题。

参考方案

我做了一个快速测试:

namespace ConsoleApplication5
{
    public interface IFacebookHelper { dynamic Get(string p); }

    class Program
    {
        static void Main(string[] args)
        {
            Mock<IFacebookHelper> mockFbHelp = new Mock<IFacebookHelper>();
            mockFbHelp.Setup(x => x.Get("me")).Returns(new { email = "[email protected]", id = "9999" });

            dynamic result = mockFbHelp.Object.Get("me");
            int facebookId = int.Parse(result.id);
            string email = result.email;
        }
    }
}

一切正常。我在这里没有问题。

您确定您没有混淆吗?

查看您发布的方法:

public dynamic Get(string p)
{
    var client = new FacebookClient(AccessToken);
    return client.Get("me");
}

也许应该是:

...
return client.Get(p);
...

_facebookHelper是否真的使用Mock对象?在测试期间,它应为IFacebookHelperProxy类型或类似类型。

编辑:

问题是您试图跨程序集边界公开匿名类型,因为您只能在创建它们的程序集中使用匿名类型。

所以代替

public class DynTestProxy:IDynTest
{
    public dynamic GetData()
    {
        return (dynamic) new { DynamicProperty = "From Unit Test" };
    }
}

您应该使用ExpandoObject:

public class DynTestProxy:IDynTest
{
    public dynamic GetData()
    {
        dynamic r = new ExpandoObject();
        r.DynamicProperty = "From Unit Test";
        return r;
    }
}

或使用InternalsVisibleTo属性。有关更多信息,请参见here。另外,this问题可能对您来说很有趣。

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

使用Nginx将动态生成的文件作为静态文件提供 - dynamic

Nginx擅长提供静态文件,因此我想知道是否可以将动态生成的文件作为静态文件提供?例如云,我们使用PHP Minify在Nginx后面的PHP-FPM上组合CSS和JS文件,并几乎像任何静态文件一样为它们提供服务,可能带有一些版本控制和缓存。因此,它的考虑和行为更像是静态文件,然后是动态文件。我知道这听起来更像是缓存,但这就是Nginx如何以最佳状态处理静态…

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…

Json到php,json_decode返回NULL - php

我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…