【问题标题】:Invalid setup on a non-overridable member:不可覆盖成员上的无效设置:
【发布时间】:2013-10-12 12:36:00
【问题描述】:

我正在尝试使用 Mock 库测试函数 GetcallEntityBycallEntity (Guid callId)。

这个函数调用另一个没有实现任何接口的类。

受保护的虚拟 CallFacade CallFacade() { 返回新的 CallFacade(); }

   public Note GetCallEntityByCallEntity(Guid CallEntity)
   {
        myCall= null;

       **CallFacade**  callFacade = Get CallFacade();

      if (CallEntity!= Guid.Empty)
       {
           myCall = callFacade.GetCallByEntityId(CallEntity);
       }
       return myCall;
   }

CallFacade 不是接口

在我的测试中:

[TestInitialize]
    public void TestInitialization()
    {
        IoCMocks.Initialize();
        CommonCallFacadeMock = new CommonCallFacadeMock();
    }
public void GetCallEntityByNoteEntity_GetCall_ReturnValidCall()
    {
        //Arrange
        CallmyNote = GetmyCall(); //private method. == Call.CreateCall();


        //Stubs
        CommonCallFacadeMock.MockCallFacade.Setup(x => x.GetCallByEntityId(ExistingCallEntity)).Returns(myCall);
        //Action
        var obtained = CommonCallFacadeMock.GetCallEntityByCallEntity(ExistingCallEntity);

        CommonCallFacadeMock.MockCallFacade.Verify(x => x.GetCallByEntityId(It.IsAny<Guid>()), Times.Once());


    }

【问题讨论】:

  • 当我设置模拟(存根)时:我收到警告 -->在不可覆盖的成员上设置无效:

标签: unit-testing mocking tdd virtual


【解决方案1】:

您收到此错误消息是因为 MOQ 只能模拟接口、抽象类上的抽象方法或属性、具体类上的虚拟方法或属性。

您必须将方法 GetCallByEntityId 标记为虚拟。

在“Moq Discussions”google 组中有an old discussion 关于虚拟方法。

【讨论】:

  • 感谢您回复我。我尝试将其标记为虚拟,但我认为,我需要有一个接口 ICallFacade callFacade = Get CallFacade();并且此方法作为受保护的虚拟 CallFacade CallFacade() { return new CallFacade(); ......我仍然得到错误
  • 1.您在哪一行代码有错误消息?您只有一个设置“CommonCallFacadeMock.MockCallFacade.Setup(x => x.GetCallByEntityId(ExistingCallEntity)).Returns(myCall);” GetCallByEntityId 方法应该是虚拟的或属于接口 ICallFacade。 2. 是的,有ICallFacade 是合理的。您可以将其提供为构造函数依赖(构造函数的参数)或方法依赖(方法的参数)
猜你喜欢
  • 2010-12-30
  • 2015-09-05
  • 1970-01-01
  • 2022-06-11
  • 2019-11-16
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
相关资源
最近更新 更多