簡體   English   中英

MOQ將動態類型作為對象問題返回

[英]MOQ returning dynamic types as object issue

如果有人提出這個問題但我無法在任何地方找到答案。

我的問題是在使用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" };
        }
    }
}

Namespace MyLib,Warrior.WebUI和Warrior.Tests指示了3個項目。
因為它是測試失敗並出現錯誤..'object'不包含在RetTest()上發生的'DynamicProperty'的定義

但是,如果我只是將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屬性。 有關更多信息,請參見此處 這個問題也許對你很有意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM