【发布时间】:2019-03-04 21:11:53
【问题描述】:
我正在编写一些单元测试。我写的其中一个测试有意外的行为,我对到底发生了什么感到困惑。问题在于模拟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。我知道表达式树和与此问题相关的其他一些主题,但是谁能解释这里到底发生了什么以及如何解决这个问题?
我将不胜感激。
【问题讨论】:
-
起订量无法匹配表达式,这就是结果为假的原因
-
谢谢@Nkosi,那么有什么办法可以改变表达式来解决这个问题吗? (如果我使用 const 数字就可以了),如果没有,有什么方法可以编写一个好的测试方法吗?
-
如何将
_list填充到TestClass中? -
@Fabio ,没关系,你可以这样考虑:
var returnValue = new List<TestModel> { new TestModel() {CreationDate = DateTime.Now, Id = 1}, new TestModel() {CreationDate = DateTime.Now, Id = 2} }; -
@Pedram,这是对单元测试的不同解释——常见的。这将介绍您遇到的问题。另一种解释是 unit - 是行为单位。您将仅模拟使您的测试变慢(外部资源)或设置非常复杂的依赖项,您可以在那里引入模拟。在您的情况下,您已经在内存中有可以为测试预配置的数据,那么您只需要定义预期结果并运行包含所有依赖项的测试。
标签: c# unit-testing lambda moq xunit