2016-08-01 47 views
2

我很困擾如何使用Moq-Setup-Return構造。如何在單元測試中使用Moq在異步方法中返回傳遞的參數?

首先我的設置:

IRepository類型的一些庫-Interface必須實現StoreAsync - 方法爲包括屬性,它返回一個StoreResult對象與所存儲實體。

using System.Threading.Tasks; 
using Moq; 
using Xunit; 

namespace Tests 
{ 
    public class Entity { } 

    public class StoreResult 
    { 
     public Entity Entity { get; set; } 
    } 

    public interface IRepository 
    { 
     Task<StoreResult> StoreAsync(Entity entity); 
    } 

    public class Tests 
    { 
     [Fact] 
     public void Test() 
     { 
      var moq = new Mock<IRepository>(); 
      moq.Setup(m => m.StoreAsync(It.IsAny<Entity>())).Returns(e => Task.FromResult<Task<StoreResult>>(new StoreResult {Entity = e})); 
     } 
    } 
} 

現在我試着寫一個實體模型OBJEKT爲IRepository接口,但是我不知道如何使StoreResult,對象包括給定的參數爲StoreAsync-實體編碼的返回,聲明功能。

我在Moq ReturnsAsync() with parametersMOQ: Returning value that was passed into a method閱讀了關於此主題。

我已經試過

moq.Setup(m => m.StoreAsync(It.IsAny<Entity>())) 
    .ReturnsAsync(entity => new StoreResult {Entity = entity}); 

與錯誤說法「無法轉換lambda表達式鍵入」 StoreResult」,因爲它不是一個委託類型。

並與我試過

同樣的錯誤信息
moq.Setup(m => m.StoreAsync(It.IsAny<Entity>())) 
    .Returns(e => Task.FromResult<Task<StoreResult>>(new StoreResult {Entity = e})); 

我使用的是.NET核心的xUnit環境Moq 4.6.36-alpha

謝謝你的幫助。

+0

它不應該僅僅是:'Task.FromResult (新StoreResult {實體= E})' –

+0

@CallumLinington - 隨着'.Returns(Task.FromResult (新StoreResult {實體= E}));' e沒有定義。 –

+1

這就是'It.IsAny'。給它一個適當的實體! –

回答

6

由於從卡勒姆Linigton我來下面溶液中的提示:

moq 
.Setup(m => m.StoreAsync(It.IsAny<Entity>())) 
.Returns((Entity e) => Task.FromResult(new StoreResult {Entity = e})); 

的關鍵區別是指定爲了避免模棱兩可的呼叫爲lambda表達式的輸入參數的類型。

相關問題