簡體   English   中英

找不到重載的方法

[英]Overloaded method not found

設置如下:

  • .NET Standard 2.0庫
  • 針對它的NUnit測試項目,針對.NETFramework 4.6.1

最新VS 2017,最新NUnit。

我周末一直在家里做這個項目,把我的工作上傳到git,今天開始從事工作(我之前已經在這兩個地方工作過)。 直到現在我才發現項目出了問題(我不記得一開始有什么問題,但似乎問題與我現在的問題相同,稍后會有所描述)。

在擺弄到無法修復的狀態之后,我完全刪除它並重新克隆了git repo。

該項目編譯良好 ,但在運行時測試拋出“未找到方法”異常。 有點戳了一下,表明問題只出現在以下方法的一次重載上:

    public static YNABClient GetInstance(HttpMessageHandler _handler)
    {
        if (instance is null)
        {
            instance = new YNABClient(_handler);
        }

        return instance;
    }

    public static YNABClient GetInstance() => GetInstance(new HttpClientHandler());

沒有參數的那個是好的,沒有參數的那個。 刪除和添加庫作為測試,刪除和添加測試和庫項目的參考。 我在互聯網上找到的類似情況的其他解決方案都屬於ASP.NET MVC,這不是我的情況,盡管這個問題確實導致我檢查重載並發現其中一個實際上有效。

在家里一切都運行正常,但我還沒有像我在工作中那樣嘗試刪除和重新安裝項目。 這導致了兩個可能的問題來源:環境,雖然我沒有設法找到有意義的差異,或git,雖然我使用“股票”git忽略VS( 這一個 ),所以那里不應該有問題。 我的項目的基本設置在周末期間並沒有改變,之前工作過,所以最近擺弄的東西就出現了問題。

此外,如果我將一個控制台應用程序(.Net Framework 4.6.1)添加到解決方案並嘗試從中調用有問題的方法,它實際上工作正常。

如果這會有所幫助,我的項目的github就在這里

我被要求在評論中提出例子。 基本上,我有2個具有不同設置的測試夾具類 - 一個用於實際API調用以便於調試實際使用,另一個用於偽造它,根據良好的測試實踐。 作品:

    [OneTimeSetUp]
    public void Setup()
    {
        ynabClient = YNABClient.GetInstance();
        ynabClient.RefreshAccessToken(ApiKeys.AccessToken);
    }

拋出異常:

    [OneTimeSetUp]
    public void Setup()
    {
        handler = new StubHandler();
        ynabClient = YNABClient.GetInstance(handler);
    }

一些討論表明我的問題很可能與.NET Framework和.NET Standard的System.Net.Http版本差異有關,如果你谷歌它,這是一個非常普遍的問題。 然而,我挖出的所有例子都沒有表現出我的特殊症狀,我還不確定該怎么做。 為什么我的家用電腦上的一切正常。

GetInstance的問題是您的GetInstance方法接受HttpMessageHandler作為參數,並且在您的測試中您傳遞的是HttpClientHandler對象。 因此,您已聲明了一個參數,但在調用該方法時提供了不同的對象。

我在我的環境中遇到了這個錯誤:

嚴重級代碼描述項目文件行抑制狀態錯誤CS0433類型'HttpMessageHandler'存在於'System.Net.Http,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'和'System.Net.Http,Version = 4.0 .0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'

您的YNABConnector是.NET Standard 2,但單元測試是4.6.1,它們對同一個程序集使用不同的簽名。

這是測試的官方文檔: https//github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard

  1. 創建了一個.NET核心庫(請注意:通過上面的鏈接不能是.NET標准庫),
  2. 在那里復制你的測試代碼,
  3. 按照官方文檔添加引用,

你的代碼工作,沒有錯誤。

但是在你的基本代碼中,我仍然更喜歡這個代碼:

public class YNABClient
{
    private static YNABClient instance;

    private HttpClient client;

    private HttpMessageHandler handler;

    private YNABClient(HttpMessageHandler _handler = null)
    {
        handler = _handler ?? new HttpClientHandler();
        client = new HttpClient(_handler);
    }

    public static YNABClient GetInstance(HttpMessageHandler _handler = null)
    {
        return instance ?? (instance = new YNABClient(_handler));
    }

    ......
}

因此,事實證明,正如DongDong所說,問題確實在於.NET Framework和.NET Standard之間的接口。 問題不在於它們是不兼容的,或者Test項目需要一些額外的依賴項,而是它們隨附了不同版本的System.Net.Http。

通過顯示沒有可見的錯誤阻礙了診斷。 但是,更改參數類型表明問題確實只來自該命名空間中的類。

診斷問題的另一個問題是該項目在某些機器(我的家用PC和Daisy Shipton的評論到問題)上工作正常。

然而,在確定問題的根源之后,我能夠首先了解庫中存在哪些問題,並最終在.NET github上發現了一系列不兼容問題。

我嘗試了在這些情況下使用的解決方案,並將“綁定重定向”添加到庫的具體版本,之后它工作正常。 我添加了重定向到我的測試項目的app.config 供參考,它看起來像這樣:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>

我仍然不明白為什么這個項目在某些機器上運行良好。

暫無
暫無

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

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