c# - C# MVC、通用存储库和带 Moq 的单元测试
问题描述
如果日期范围与列表的任何项目重叠,我必须测试一个返回 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 类中的逻辑?
解决方案
问题是您没有测试代码的真实实现,而是测试了模拟代码。在单元测试中,您通常希望测试真正的实现。所以在你的情况下,你必须创建一个实例HolidayRequestRepository
并调用这个对象的方法,例如
var hrr = new HolidayRequestRepository(...);
var actual = hrr.IsHolidayRequestAlreadyCreated(empId, dtFrom, dtTo);
Assert.True(actual);
为了使其工作,您需要设置提供给构造函数的 DbContext,以便测试用例所需的数据可用。
推荐阅读
- r - 如何将单个列传播或转换为多个 - 错误:行的标识符重复
- java - 在android java项目中实现requery的困难
- android - java.lang.RuntimeException: Unable to start activity ComponentInfo 确保首先调用 FirebaseApp.initializeApp(Context)
- xamarin.forms - 加载 ZXing.net.mobile.form 时遇到 NullPointerException
- paypal - 如何将数据从我的网站传递到贝宝
- c++ - C++ | 有理数运算
- javascript - 每次用户调用其初始化时销毁旧的光滑轮播实例
- php - 如何识别页面的 URL 并根据 URL 执行操作
- python - 如何成功使用snow_record?
- javascript - Google Charts 散点图适用于 Chrome Macbook,但不适用于 Chrome iPhone