Оператор '==' нельзя применить к операндам типа 'Task <(IEnumerable <Item>, int)>' и 'Task' - PullRequest
0 голосов
/ 13 ноября 2018

У меня была следующая функция, которую нужно смоделировать.

public interface IRepository
{
    Task<IEnumerable<Item>> GetItems(int total);
}

И мой код насмешки был

private readonly IEnumerable<Item> stubList = new List<Item> { new Item { } };

mockRepository = Mock.Of<IRepository>(r => r.GetItems(50) == Task.FromResult(stubList));

Он работал как на моем рабочем столе (Visual studio 2017), так и на msbuild (MSBuild auto-detection: using msbuild version '15.8.169.51996' from 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\bin') на сервере Jenkin.

Теперь метод был изменен на

public interface IRepository
{
    Task<(IEnumerable<Item>, int)> GetItems(int total);
}

И код насмешки был изменен на

private readonly IEnumerable<Item> stubList = new List<Item> { new Item { } };

var m = (stubList, 1);
mockRepository = Mock.Of<IRepository>(r => r.GetItems(50) == Task.FromResult(m));

Он все еще работает на моемрабочий стол (visual studio 2017).Но msbuild завершился ошибкой со следующим сообщением об ошибке?

error CS0019: Operator '==' cannot be applied to operands of type 'Task<(IEnumerable<Item>, int)>' and 'Task<IEnumerable<Item>>'

build.log:

CoreResGen: "C: \ Program Files \ Microsoft SDKs \ Windows\ v6.0A \ bin \ Resgen.exe "/ useSourcePath /r:"D:\Jenkins\workspace...\packages\DocumentFormat.OpenXml.2.8.1\lib\net35\DocumentFormat.OpenXml.dll" / r:C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.JScript.dll /r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll / r: "C: \ Program Files(x86) \ Справочные сборки \ Microsoft \ Framework \ v3.5 \ System.Core.dll "/ r:" C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework \ v3.5 \ System.Data.DataSetExtensions.dll "/r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /r: C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.dll /r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll / r: "C: \Программные файлы (x86) \ Справочные сборки \ Microsoft \ Framework \ v3.0 \ System.Runtime.Serialization.dll "/ r:" C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework \ v3.0 \ System.ServiceModel.dll "/r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ System.Web.Services.dll /r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ System.Xml.dll / r: "C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework \ v3.5 \ System.Xml.Linq.dll" / r: "C: \ Program Files (x86)\ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ WindowsBase.dll "/ compile Components \ CheckedComboBox \ PopupComboBox.resx, obj \ Release \ PresentationControls.PopupComboBox.resources Компоненты \ DGV \ DgvDesignerColumnList.resx, obj \ ReleaseSligner_Direct_Lirect_Direct_Lirect_LirectInstall.resources Components \ DGV \ frmGridColumnsExt.resx, obj \ Release \ Infrastructure.frmGridColumnsExt.resources Компоненты \ DGV \ dgv.resx, obj \ Release \ Infrastructure.DGV.resources Компоненты \ DGV \ frmChangeGridState.resx, инфраструктура \ ReleasefrmChangeGridState.resources Components \ DGV \ frmGridColumns.resx,Компоненты obj \ Release \ Infrastructure.frmGridColumns.resources \ UserControl_Folder.resx, obj \ Release \ Infrastructure.UserControl_Folder.resources frmDropDownBox.resx, obj \ Release \ Infrastructure.frmDropDownBox.resources frmUsersChangeHistjorshan.Exchange.Exchange.UserистfrmUserPermissions.resx, obj \ Release \ Infrastructure.frmUserPermissions.resources frmUserRegProdGroups.resx, obj \ Release \ Infrastructure.frmUserRegProdGroups.resources frmErrorBox.resx, obj \ Release \ Infrastructure.frmErrorBoxBridBrid.FxBresourceFresbx.resources.resources frmInputBox.resx, obj \ Release \ Infrastructure.frmInputBox.resources frmLongTask.resx, obj \ Release \ Infrastructure.frmLongTask.resources frmNoteBox.resx, obj \ Release \ Infrastructure.frmNoteBox.resources Components \ ReleaseP, месяцев\ Infrastructure.MonthPicker.resources frmUserGroups.resx, obj \ Release \ Infrastructure.frmUserGroups.resources frmUsers.resx, obj \ Release \ Infrastructure.frmUsers.resources Properties \ Resources.resx, obj \ Release \ Infrastructure.Properties.Resources.resources Отчеты \ frmEditReports.resx, obj \ Release \ Infrastructure.frmEditReports.resources Отчеты \ frmJobsMaintenance.resx, obj \ Release \ Infrastructure.frmJobsMaintenance.resources Reports.resx, obj \ Release \ Infrastructure.frmRunReports.resources Отчеты \ frmSelectReport.resx, obj \ Release \ Infrastructure.frmSelectReport.resources Отчеты \ frmShowReportLog.resx, obj \ Release \ Infrastructure.frmShowReportLog.resources

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Когда я пробую ваш код:

class Program
{
    static void Main(string[] args)
    {
        var stubList = new List<Item>
        {
            new Item()
        };

        var m = (stubList, 1);

        var mockRepository = Mock.Of<IRepository>(r => r.GetItems(50) == Task.FromResult(m));
    }
}

interface IRepository
{
    Task<(IEnumerable<Item>, int)> GetItems(int total);
}

class Item
{
}

Я получаю другую ошибку компилятора:

Оператор CS0019 '==' нельзя применить к операндам типа 'Task <(IEnumerable, int)>' и 'Task <(List stubList, int)>'

Это происходит потому, что вы сравниваете Task<(List<Item>, int)> и Task<(IEnumerable<Item>, int)>. Task<T> не является ко-вариантом (например, напротив List<T>), поэтому ожидается ошибка.

Но почему ваш вопрос содержит другую ошибку компилятора?


Если я изменю код на это:

var m = ((IEnumerable<Item>)stubList, 1);

или это:

(IEnumerable<Item>, int) m = (stubList, 1);

тогда это соответствует.

0 голосов
/ 13 ноября 2018

Попробуйте использовать более подробный подход вместо LINQ to Mocks

private readonly IEnumerable<Item> stubList = new List<Item> { new Item { } };

//...

var expected = (stubList, 1);

var mock = new Mock<IRepository>();
mock
    .Setup(_ => _.GetItems(50))
    .ReturnsAsync(expected); 

IRepository mockRepository = mock.Object;

//...

У платформы могут быть проблемы при попытке оценить выражение с новым синтаксисом

...