Я пишу несколько юнит-тестов.Один из написанных мною тестов имеет неожиданное поведение, и я не совсем понимаю, что именно произошло.Проблема в насмешливом методе 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 здесь.Я знаю о дереве выражений и некоторых других темах, связанных с этой проблемой, но кто-нибудь может объяснить, что именно здесь происходит и как я могу решить эту проблему?
Буду признателен за любую помощь.