簡體   English   中英

FluentAssertions 錯誤 CS0012:您必須添加對程序集 System.Data 的引用

[英]FluentAssertions error CS0012: You must add a reference to assembly System.Data

我在使用 .NET Framework 4.6.1 的測試項目中添加了 nuget FluentAssertions 6.7.0 我從 Rider 2022.1.1 運行測試。

我是這個 nuget 的新手,我閱讀了介紹並搜索了問題(未找到)。 我來自應該家庭並試圖升級。

我不能用基本的斷言來構建。 這是初始代碼:

    using FluentAssertions;
    using Moq;
    using System;
    using Xunit;

    public class MyTestClass
    {
        [Fact]
        public void GetProvider_ByRemoteName_Works()
        {
            // input
            var desiredRemoteName = "Remote2";
            
            // prepare
            var context = Context.New(); // mocks and stubs
            
            // execute
            var result = context.SomeService.GetProvider(desiredRemoteName);
            
            // verify
            result.Should().NotBeNull();                      // error line
            result.Should().BeOfType<MyProviderClient>();     // error line
        }

構建錯誤是:

錯誤 CS0012:“DataTable”類型是在未引用的程序集中定義的。 您必須添加對程序集“System.Data,Version=0.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。
錯誤 CS0012:“DataColumn”類型是在未引用的程序集中定義的。 您必須添加對程序集“System.Data,Version=0.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。
...
錯誤 CS0012:“DataRow”類型是在未引用的程序集中定義的。 您必須添加對程序集“System.Data,Version=0.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。

我不明白為什么我應該引用這個“System.Data”程序集。 這似乎不合法。 如果我確實引用它:

MyTestClass.cs:[CS0121] 以下方法或屬性之間的調用不明確:“DataRowAssertionExtensions.Should(TDataRow)”和“DataSetAssertionExtensions.Should(TDataSet)”


此外,刪除錯誤行並using行提供了有效的構建和測試運行。

此外,IDE 編輯器指示:

以下方法或屬性之間的調用不明確:“DataRowAssertionExtensions.Should(TDataRow)”和“DataSetAssertionExtensions.Should(TDataSet)”

此外,使用 Xunit 的斷言有效:

            // verify
            Assert.NotNull(result);
            Assert.IsType<MyProviderClient>(result);

跟進您的評論,讓我們考慮這個更新的代碼:

            // execute
            object result = context.SomeService.GetProvider(desiredRemoteName);

            // verify
            result.Should().BeAssignableTo<IMyInterface>()
               .And.BeOfType<SomeImplementation>()
               .Which
               .Configuration
               .Should()                    // error line
               .NotBeNull();

在最新的.Should()調用中也會出現同樣的錯誤。

MyTestClass.cs:[CS0121] 以下方法或屬性之間的調用不明確:“DataRowAssertionExtensions.Should(TDataRow)”和“DataSetAssertionExtensions.Should(TDataSet)”

使用 FluentAssertions 執行.BeOfType<>().Which到處都是? 我覺得我這邊或庫的工作方式有問題。

您列出的 IDE 錯誤表明編譯器不知道要調用哪個.Should()重載。 對於任何依賴重載解析的庫來說,這並不罕見。

由於看起來您只是打算在此上下文中測試返回類型,因此您只“需要” .Should .Should()ObjectAssertions重載。 因此,一種方法可以避免這樣的模棱兩可的調用:

object result = context.SomeService.GetProvider(desiredRemoteName);
            
result.Should().BeOfType<MyProviderClient>() // Chained FA assertions are now typed as MyProviderClient
    .Which.Should().BeEquivalentTo(new { Foo = "bar" });

觀察: 鏈式斷言類型的演示

請記住,值null沒有運行時類型,因此斷言對象具有某些特定的運行時類型隱式斷言它不是 null。 如果斷言空引用,FA 的.BeOfType<T>()斷言將失敗並顯示特定消息。

我記得,.NET Framework 4.6.1 存在一個奇怪的問題,即沒有自動添加對System.Data的程序集引用。 對於較新的框架版本,它會自動發生。

暫無
暫無

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

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