亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用接口在 Moq 中模擬泛型方法

使用接口在 Moq 中模擬泛型方法

C#
慕姐8265434 2022-09-04 16:12:34
我正在嘗試為以下通用接口設置最小起算,但遇到異常 public interface IReadAccess<TEntity> {     Task<IEnumerable<TEntity>> GetAll(); }var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());m.VerifyAll();獲取波紋管異常Moq.MockException  HResult=0x80131500  Message=The following setups on mock    'Mock<EPIC.CrossCutting.Interfaces.DAL.Framework.IReadAccess<EPIC.CrossCutting.DTOs.Data.Announcement.AnnouncementCrosscutDTO>:00000002>'   were not matched:IReadAccess<AnnouncementCrosscutDTO> p => p.GetAll()  Source=Moq  StackTrace:   at Moq.Mock.VerifyAll()   at EPIC.Tests.Business.Rules.Announcements.AnnouncementPlanning.CrosscutsProgrammaticActivitiesValidationRuleServiceTests.<ExecuteSuccessTest>d__5.MoveNext() in D:\dev\main\Tests\EPIC.Tests.Business.Rules\Announcements\AnnouncementPlanning\CrosscutsProgrammaticActivitiesValidationRuleServiceTests.cs:line 108
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

您的測試正確失敗,因為您嘗試驗證 GetAll() 是否被調用,即使您實際上并未調用它。


如果在測試或正在測試的代碼中調用該方法,它將通過。


[Fact]

public async Task Test1()

{

    var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);

    m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());


    var result = await m.Object.GetAll();


    m.VerifyAll();

}

線索在您的錯誤消息中:消息=模擬上的以下設置....不匹配: IReadAccess p => p.GetAll()


查看完整回答
反對 回復 2022-09-04
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

這是預期的工作,但我有類似的方法


public interface IReadAccess<TEntity>  

{  

    Task<IEnumerable<TEntity>> GetAll();   

    Task<IEnumerable<TEntity>> Find(FormattableString whereClause, object whereClauseObject);


并嘗試設置


var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);

m.Setup(x => x.Find($"ID = @ID", new { ID = 5 })).ReturnsAsync(new List<Foo>());

var result = await m.Object.Find($"ID= @ID", new { ID = 5 });

m.VerifyAll();

在對現有代碼進行了一些更改后,現在安裝程序工作正常,但是當它從測試,更新的代碼調用時,實際服務會出現錯誤


var test = new Test {ID = 5};

object whereClause = new { ID = test.ID };

            FormattableString formattableString = $"ID = @ID";


            m.Setup(x => x.Find(formattableString, whereClause)).ReturnsAsync(new List<Foo>());


 var ruleServiceOutput = await this.testValidationRuleService.ExecuteAsync(test);

實際代碼


public async Task<IRuleServiceOutput<bool>> ExecuteAsync(Test test)

        {

            var errors = new List<string>();


            object whereClause = new { ID = test.ID };

            FormattableString formattableString = $"ID = @ID";


            var output = (await m.Find(formattableString, whereClause)).ToArray();


            return new RuleServiceOutput<bool>(output.Errors.IsEmpty(), output.Errors);

        }

'IReadAccess'1.Find(ID = @ID, { ID = 5 }) 調用失敗,模擬行為嚴格。模擬上的所有調用都必須具有相應的設置。


設置 MockBehavior 后。默認所有正常工作的預期:)


查看完整回答
反對 回復 2022-09-04
  • 2 回答
  • 0 關注
  • 110 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號