gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:49:04 24 4
gpt4 key购买 nike

如果有人问过这个问题,请道歉,但我在任何地方都找不到答案。

我的问题是在使用 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");
}

来自 Controller 的代码使用模拟结果。

_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 - 部分回答.. 问题毕竟与最小起订量无关

实际上,问题似乎是由于在不同程序集中创建的动态类型。尽管我使用 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 个项目。
因为它是测试失败并出现错误..
“object”不包含“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 = "test@test.com", 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问题对你来说可能很有趣。

关于c# - MOQ 返回动态类型作为对象问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10896089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com