【发布时间】:2020-01-11 22:03:12
【问题描述】:
如果日期范围与列表的任何项目重叠,我必须测试一个返回 true 或 false 的方法。
列表项是假期请求:
public class HolidayRequest
{
public int Id { get; set; }
public string EmployeeId { get; set; }
public DateTime DateFrom { get; set; }
public DateTime DateTo { get; set; }
}
public interface IHolidayRequestRepository :IGenericRepository<HolidayRequest>
{
bool IsHolidayRequestAlreadyCreated(String EmployeeId, DateTime DateFrom, DateTime DateTo);
}
public interface IGenericRepository<TEntity> where TEntity : class
{
IQueryable<TEntity> GetAll();
TEntity Get(object id);
//skipped
}
现在进行单元测试:
[TestClass]
public class UnitTest1
{
private Mock<IHolidayRequestRepository > _holidayRepository;
[TestInitialize]
public void Initialize()
{
_holidayRepository = new Mock<IHolidayRequestRepository >();
}
[TestMethod]
public void TestMethod1()
{
//Arange
IList<HolidayRequest> list = new List<HolidayRequest>
{
new HolidayRequest{ Id =1, EmployeeId="E00001", DateFrom = new DateTime(2019,09,13,0,0,0), DateTo = new DateTime(2019,09,13,0,0,0)}
};
_holidayRepository.Setup(x => x.GetAll()).Returns(list.AsQueryable);
var howMany = _holidayRepository.Object.GetAll().Count();
//Assert
Assert.AreEqual(1, howMany); //<- Test passed
bool val = _holidayRepository.Object
.IsHolidayRequestAlreadyCreated("E00001", new DateTime(2019, 9, 12), new DateTime(2019, 9, 14));
////Assert
Assert.IsTrue(val); //<- Test error - always return false
}
}
我希望测试结果为真,但它总是返回假,即使方法被简化为总是返回真
方法:
bool IsHolidayRequestAlreadyCreated(String EmployeeId, DateTime DateFrom, DateTime DateTo);
被简化为始终返回 true:
public class HolidayRequestRepository : GenericRepository<HolidayRequest>, IHolidayRequestRepository
{
public HolidayRequestRepository(MvcDbContext context) : base(context) { }
public bool IsHolidayRequestAlreadyCreated(string EmployeeId, DateTime DateFrom, DateTime DateTo)
{
return true;
}
}
我应该如何模拟这个方法来使用来自 HolidayRequestRepository 类的逻辑?
【问题讨论】:
-
你不是在模拟
IsHolidayRequestAlreadyCreated方法,因此模拟返回默认值,即falseforbool。只需为IsHolidayRequestAlreadyCreated方法设置模拟即可。 -
您模拟被测系统的依赖项,而不是系统本身。否则,您将要测试的只是模拟是否按照您的指示执行。并且由于您在调用
IsHolidayRequestAlreadyCreated()时没有指示您的松散模拟返回某些内容,因此它返回其默认值,在本例中为false。为此测试完全删除此模拟。 -
测试你的实现的模拟没有什么价值。尝试创建一个真实的实例并调用该方法。在您的示例中,
MvcDbContext可能是您想要模拟的东西
标签: c# .net unit-testing moq