【问题标题】:Not able to use moq in unit testing无法在单元测试中使用起订量
【发布时间】:2017-03-16 05:35:15
【问题描述】:

我刚开始使用 moq 对象进行单元测试,我不确定我这样做是否正确,请帮助!!

Public Class Mrr: IMrr
{ 

   public int Delete(double obj)
   {
        int rtcode = somefunction(obj);// retreiving some code from function
        int DeleteMrr= DeleteFunction(rtcode);  // delete function executes here          
        return 0;
   }

}

这是界面

public interface IMrr
{
    int Delete(double obj);
}

而我的测试方法是这样的。

[TestMethod()] 
public void RetrieveSaveDeleteMRR()
{      
    var FakeObject = new Moq.Mock<IMrr>();
    FakeObject.Setup(x => x.Delete(It.IsAny<int>())).Returns(0);
    var Res = FakeObject.Object.Delete(10);
}

这不是去执行那个方法的实际函数,它假设去那里去那个方法。我不知道。

【问题讨论】:

    标签: c# asp.net unit-testing dependency-injection moq


    【解决方案1】:

    如果你要测试Mrr.Delete() 方法,你不应该模拟Mrr。您应该创建Mrr 类的真实实例并调用其方法。

    您通常希望模拟 Mrr 依赖项(您的示例中没有),以便不调用真正的依赖项方法。

    注意:您忘记从接口IMrr 继承Mrr

    【讨论】:

    • 嗨,我编辑了我的代码,你能告诉我你在这里谈论的真正依赖是什么吗?
    • 请查看此起订量基本教程 - deanhume.com/home/blogpost/…
    • 实现需要接口吗?
    • 实际上并不是必需的。但是,从接口继承您的实现并让消费者通过接口而不是通过直接实现类工作是一个很好的做法。检查这个:codeproject.com/Articles/702246/…
    【解决方案2】:

    在您的示例中,Mrr 类没有任何依赖项。要解释什么是依赖关系,请查看以下示例。

    public class Mrr: IMrr
    { 
        // This is dependency
        IDelete _deleteObject;
    
        public Mrr(IDelete deleteObject)
        {
            _deleteObject = deleteObject;
        }
    
       public int Delete(double obj)
       {
            int rtcode = somefunction(obj);
            int DeleteMrr = _deleteObject.DeleteFunction(rtcode);  
            return 0;
       }
    }
    
    public interface IDelete
    {
        int DeleteFunction(int rtcode);
    }
    

    此依赖项在构造函数中传入,因此您可以在测试中提供自己的模拟实例。

    与这种情况比较:

    public class Mrr: IMrr
    { 
        // This is dependency
        IDelete _deleteObject;
    
        public Mrr()
        {
            _deleteObject = new DeleteClass();
        }
    }
    

    每次使用new 时,都无法在单元测试中注入您自己的实现。

    然后测试可能看起来像这样。

    [TestMethod] 
    public void RetrieveSaveDeleteMRR()
    {    
        // Arange
        int expected = 1;
        Moq.Mock<IDelete> deleteObjectMock = new Moq.Mock<IDelete>();
        deleteObjectMock.Setup(x => x.DeleteFunction(It.IsAny<int>())).Returns(1000);
        Mrr testedObject = new Mrr(deleteObjectMock.Object);
    
        // Act
        int actual = testedObject.Delete(10);
    
        // Assert
        Assert.AreEqual(expected, actual);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多