第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ExpectedObjects 比較具體對象而不是僅比較接口

ExpectedObjects 比較具體對象而不是僅比較接口

C#
慕少森 2023-08-20 10:23:35
我有一個利用ExpectedObjects 的xUnit 單元測試項目?,F(xiàn)在我正在嘗試測試一個返回符合接口的對象的服務(wù)。為了解決這個問題,我們舉一個示例界面public interface INamed{    string Name { get; }}和兩種不同的實現(xiàn):public class ComplexEntity : INamed{    public int Id { get; set; }    public string Name { get; set; }    public string Domain { get; set; }    /* Many other properties follow... */}public class SimpleEntity : INamed{    public int Id { get; set; }    public string Name { get; set; }}被測方法的簽名為public IEnumerable<INamed> GetNames();我所關(guān)心的是返回正確的名稱。因此,在模擬服務(wù)可能采用的任何依賴項之后,我構(gòu)建了一個預(yù)期結(jié)果集,如下所示:IEnumerable<INamed> expected = new []{    new SimpleEntity { Name = "NAM1" },    new SimpleEntity { Name = "NAM2" },    ...}我將它們進行比較如下:// ACTvar result = systemUnderTest.GetNames();// ASSERTexpected.ToExpectedObject().ShouldMatch(result);這將會失敗。被測對象實際返回的集合是和GetNames的混合集合,并且沒有一個會匹配,因為返回對象的屬性非零,而我不關(guān)心的其他屬性甚至不存在于該集。SimpleEntitiesComplexEntitiesIdComplexEntityexpectedExpectedObjects 文檔沒有給我這方面的指導(dǎo)。ShouldMatch應(yīng)該適用于匿名類型,所以這應(yīng)該(并且確實)有效:expected.Select(e => new { e.Name }).ToExpectedObject().ShouldMatch(result);但我認為這是一種不靈活的解決方法。還有許多其他帶有契約的方法,僅包括我不關(guān)心底層類型的接口。我必須在每個此類測試中從接口手動選擇相同的屬性,并且如果該接口發(fā)生更改以包含更多屬性,則測試仍然會通過,即使它們無法正確檢查契約。例如,如果我將Id屬性添加到INamed,測試仍然會通過,甚至永遠不會測試Id,從而允許錯誤默默地繼續(xù)。是否有一種開箱即用的方法可以使 ExpectedObjects 僅比較公共接口?我想我可以手動編寫一個人為的動態(tài)方法,從接口中創(chuàng)建一個匿名類型,使其通用并使用它,其用法如下:expected.ToExpectedObject().ShouldMatchInterface<INamed>(result);但這首先讓我對使用該庫產(chǎn)生疑問,因為投入的努力ShouldMatchInterface可能會很大。
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經(jīng)驗 獲得超6個贊

您似乎沒有正確設(shè)置預(yù)期對象。


例如,使用GetNames()這樣的實現(xiàn):


public class Foo

{

    public IEnumerable<INamed> GetNames()

    {

        return new[] {

            new ComplexEntity() { Id = 1, Name = "NAM1", Domain = "DOM1" },

            new ComplexEntity() { Id = 2, Name = "NAM2", Domain = "DOM2" }

        };

    }

}

以下 xUnit + ExpectedObjects 測試將通過:


using ConsoleProject;

using ExpectedObjects;

using Xunit;


namespace ConsoleProject_Tests

{

    public class ExpectedObjectsTests

    {

        [Fact]

        public void GetNames_should_return_INamed_ExpectedObjects_Style()

        {

            var expected = new[]

            {

                new { Name = "NAM1" },

                new { Name = "NAM2" }

            }.ToExpectedObject();


            var systemUnderTest = new Foo();

            var actual = systemUnderTest.GetNames();


            expected.ShouldMatch(actual);

        }

    }

}

請注意,ToExpectedObject()正在提供匿名對象,而不是具體類。


IEqualityComparer<INamed>現(xiàn)在將其與通過實現(xiàn)恰巧在測試類上的自定義來執(zhí)行操作的舊方法進行比較......


using ConsoleProject;

using System;

using System.Collections.Generic;

using Xunit;


namespace ConsoleProject_Tests

{

    public class ClassicXUnitTests : IEqualityComparer<INamed>

    {

        bool IEqualityComparer<INamed>.Equals(INamed x, INamed y)

        {

            if (x == null && y == null) return true;

            if (x == null || y == null) return false;

            return String.Equals(x.Name, y.Name);

        }


        int IEqualityComparer<INamed>.GetHashCode(INamed obj)

        {

            return obj.Name.GetHashCode();

        }


        [Fact]

        public void GetNames_should_return_INamed_xUnit_Style()

        {

            var expected = new[]

            {

                new SimpleEntity() { Name = "NAM1" },

                new SimpleEntity() { Name = "NAM2" }

            };


            var systemUnderTest = new Foo();

            var actual = systemUnderTest.GetNames();


            Assert.Equal<INamed>(expected, actual, this);

        }

    }

}

它仍然需要一個具體的類來實現(xiàn),INamed因為您不能只創(chuàng)建一個新的抽象類或接口。


查看完整回答
反對 回復(fù) 2023-08-20
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號