Модульное тестирование - неожиданный результат от лямбда-выражения в фиктивном объекте - PullRequest
0 голосов
/ 05 марта 2019

Я пишу несколько юнит-тестов.Один из написанных мною тестов имеет неожиданное поведение, и я не совсем понимаю, что именно произошло.Проблема в насмешливом методе GetAsync.Когда я использую переменную типа limit, код работает неправильно, но если я использую const вместо переменных, он работает нормально.Вот мой исходный код:

namespace TestClass
{
    public class LambdaTest<T> where T : TestModel
    {
        readonly List<T> _list = new List<T>();
        public virtual IEnumerable<T> GetAsync(Expression<Func<T, bool>> predicate)
        {
            return _list.AsQueryable().Where(predicate).Where(x => !x.IsDeleted).ToList();
        }

        public IEnumerable<T> TestMethod()
        {
            int limit = 100;
            var result = GetAsync(p => !p.IsDeleted && (DateTime.Now - p.CreationDate).TotalHours < limit);
            return result;
        }
    }

    public class TestModel
    {
        public long Id { get; set; }
        public bool IsDeleted { get; set; }
        public DateTime CreationDate { get; set; }
    }
}

И тестовый проект:

namespace TestClass.Tests
{
    public class ExpressionTest
    {
        [Fact]
        public void SimpleTest()
        {
            var returnValue = new List<TestModel>
            {
                new TestModel() {CreationDate = DateTime.Now, Id = 1},
                new TestModel() {CreationDate = DateTime.Now, Id = 2}
            };
            var sut = new Mock<LambdaTest<TestModel>>();
            int limit = 100;
            sut.Setup(x => x.GetAsync(p => !p.IsDeleted && (DateTime.Now - p.CreationDate).TotalHours < limit))
               .Returns(returnValue);

            var result = sut.Object.TestMethod();

            Assert.True(true);
        }
    }
}

Я не могу использовать const здесь.Я знаю о дереве выражений и некоторых других темах, связанных с этой проблемой, но кто-нибудь может объяснить, что именно здесь происходит и как я могу решить эту проблему?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 14 марта 2019

Наконец-то я решил проблему.Я смоделировал поведение метода примерно так:

sut.Setup(x => x.GetAsync(
                It.IsAny<Expression<Func<TestModel, bool>>>()
            ))
            .Returns((Expression<Func<TestModel, bool>> predict) =>
            {
                var result = _list.Where(predict.Compile());
                return Task.FromResult(result);
            });
...