【问题标题】:C# MVC, Generic Repository and Unit Testing with MoqC# MVC、通用存储库和带 Moq 的单元测试
【发布时间】: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 方法,因此模拟返回默认值,即false for bool。只需为 IsHolidayRequestAlreadyCreated 方法设置模拟即可。
  • 您模拟被测系统的依赖项,而不是系统本身。否则,您将要测试的只是模拟是否按照您的指示执行。并且由于您在调用 IsHolidayRequestAlreadyCreated() 时没有指示您的松散模拟返回某些内容,因此它返回其默认值,在本例中为 false。为此测试完全删除此模拟。
  • 测试你的实现的模拟没有什么价值。尝试创建一个真实的实例并调用该方法。在您的示例中,MvcDbContext 可能是您想要模拟的东西

标签: c# .net unit-testing moq


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 :),我固执地尝试使用界面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多