首页 > 解决方案 > 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 类中的逻辑?

标签: c#.netunit-testingmoq

解决方案


问题是您没有测试代码的真实实现,而是测试了模拟代码。在单元测试中,您通常希望测试真正的实现。所以在你的情况下,你必须创建一个实例HolidayRequestRepository并调用这个对象的方法,例如

var hrr = new HolidayRequestRepository(...);
var actual = hrr.IsHolidayRequestAlreadyCreated(empId, dtFrom, dtTo);
Assert.True(actual);

为了使其工作,您需要设置提供给构造函数的 DbContext,以便测试用例所需的数据可用。


推荐阅读