2017-08-14 163 views
1

我是单元测试新手。尝试整合遗留代码的单元测试。 要moq类的相同的方法,我需要注入接口或有任何其他选项。单元测试C#MOQ依赖注入

如果向构造函数的接口注入是唯一的方法,那么如何定义现有代码的默认构造函数。 实施例:

private IController _iController; 
    public Controller(IController iController) 
    { 
     _iController= iController; 

    } 
    public ActionResult ActualMethod() 
    { 
     _iController.FillViewBag(); 
     return View(); 
    } 
    public void UnitTest() 
    { 
     var i = new Mock<IController>(); 
     i.Setup(d => d.FillViewBag()); 
     var controller = new Controller(i.Object); 
     controller.ActualMethod(); 
    } 

对于上述代码我能够进行单元测试。 但是,如果我浏览的方法(手动测试行动)它是失败的对象ref没有设置。因为对象是空的。如何解决这个问题?

另外我在很多地方使用FillViewBag,那些地方我现在不想改变基于接口的调用。请指教。

回答

2

您嘲笑IController接口,然后将模拟对象传递给您的构造函数。

var mockController = new Mock<IController>(); 

var controller = new Controller(mockController.Object); 

你还需要设置你想要的嘲笑FillViewBag做什么:信息的这个

var mockController.Setup(c => c.FillViewBag).Callback(() => do something here); 

大量的起订量Quickstart

+0

非常感谢您的答复。我已经提到了我的问题中的相同内容。我在模拟中没有任何问题。但在应用程序中,我正在使用函数调用_interface.FillViewBag()这是给对象引用没有设置错误。 (如果我运行该项目 - 不单位测试)。基本上我会通过传递模拟接口来从单元测试中调用控制器类。这工作正常。如果我想调用控制器类的方法应该做什么。请指教!! – Antony

+0

https://kakimotonline.com/2011/02/13/tdd-in-asp-net-mvc-applications-with-moq-framework/这是我如何做嘲笑。但问题是,我的菜单路由到ProductController/List。在调用它时由于构造器参数无效而失败。那么我是否需要提供额外的默认构造函数而没有任何参数?如果我这样做,我正在获取对象引用错误。请指教 – Antony