Ошибка при попытке проверить изолированный IQueryable - PullRequest
0 голосов
/ 26 января 2019

Контекст:

Я хочу проверить, действительно ли это делает фрагмент кода, который подразумевает наложение некоторых операций поверх IQueryable<T>. Но когда я начинаю с кода, который, как известно, работает, и пытаюсь написать тест для его проверки, я получаю непонятную ошибку.

Актуальный вопрос:

Я хотел бы понять эту ошибку, что она означает и почему она происходит.

Не X-Y вопросы !!

Я не заинтересован здесь в том, каков наилучший способ достижения моей первоначальной цели, или если бы этот тест достиг ее. Я задаю этот вопрос отдельно ( ссылка ). В этом вопросе я искренне хочу знать, "что вообще означает эта ошибка, и почему это происходит с кодом, который, как я знаю, в основном работает".


Сообщение об ошибке:

System.ArgumentException : Expression of type '' cannot be used for parameter of type
  'System.Linq.IQueryable`1[ADH.Web.API.Tests.Services.QueryableTest+DemoDomainModel]' of method 
  'System.Linq.IQueryable`1[ADH.Web.API.Tests.Services.QueryableTest+DemoViewModel] 
  Select[DemoDomainModel,DemoViewModel](System.Linq.IQueryable`1[ADH.Web.API.Tests.Services.QueryableTest+DemoDomainModel], 
  System.Linq.Expressions.Expression`1[System.Func`2[ADH.Web.API.Tests.Services.QueryableTest+DemoDomainModel,ADH.Web.API.Tests.Services.QueryableTest+DemoViewModel]])'
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector)
at ADH.Web.API.Tests.Services.QueryableTest.DemoService.GetAllDemoViewModels() in C:\Work\ADH\ADH\Actuarial Data Hub\ADH.Web.API.Tests\Services\QueryableTest..cs:line 50
at ADH.Web.API.Tests.Services.QueryableTest.CheckQueryableCompiles() in C:\Work\ADH\ADH\Actuarial Data Hub\ADH.Web.API.Tests\Services\QueryableTest..cs:line 71

Упрощение первой строки:

System.ArgumentException : Expression of type '' cannot be used for parameter of type
  'IQueryable`1[DemoDomainModel]' of method 
  'IQueryable`1[DemoViewModel] Select[DemoDomainModel,DemoViewModel]
  (IQueryable`1[DemoDomainModel], Expression`1[Func`2[DemoDomainModel,DemoViewModel]])'

Код и тест, который вызывает ошибку (Классы + модульный тест)

using System.Linq;
using NUnit.Framework;
using FakeItEasy;

namespace ADH.Web.API.Tests.Services
{
    public class QueryableTest
    {
        public class DemoDomainModel
        {
            public int Id { get; set; }

            public string Reference { get; set; }

            public int ChildId { get; set; }
            public DemoChildDomainModel Child { get; set; }
        }

        public class DemoChildDomainModel
        {
            public int Id { get; set; }

            public string ChildReference { get; set; }
        }

        public class DemoViewModel
        {
            public int Id { get; set; }
            public string Reference { get; set; }
            public string ChildReference { get; set; }
        }

        public interface IDemoRepository
        {
            IQueryable<DemoDomainModel> GetAllDemos();
        }

        public class DemoService
        {
            private readonly IDemoRepository _demoRepository;

            public DemoService(IDemoRepository configRepository)
            {
                _demoRepository = configRepository;
            }
            public IQueryable<DemoViewModel> GetAllDemoViewModels()
            {
                var demos = _demoRepository.GetAllDemos();

                return demos.Select(demo => new DemoViewModel()
                {
                    Id = demo.Id,
                    Reference = demo.Reference,
                    ChildReference = demo.Child.ChildReference
                });
            }
        }
        private DemoService _demoService;
        private IDemoRepository _fakeDemoRepository;

        [SetUp]
        public void Setup()
        {
            _fakeDemoRepository = A.Fake<IDemoRepository>();
            _demoService = new DemoService(_fakeDemoRepository);
        }

        [Test]
        public void CheckQueryableCompiles()
        {
            _demoService.GetAllDemoViewModels();
        }
    }
}
...