2009-10-05 60 views
3

我有一个基础控制器,我可以轻松地将数据传递到母版页视图。然而,这个基础控制器得到一个服务层传递给它,每当我运行我的单元测试时,这个服务层就会杀死它,因为它试图访问一些数据库的东西。如何在asp.net mvc中模拟基础控制器?

private ServiceLayer service; 

     public ApplicationController():this(new ServiceLayer()) 
     { 
     } 

     public PlannerApplicationController(IServiceLayer serviceS) 
     { 
      service= serviceS;   
     } 

     protected override void Initialize(RequestContext requestContext) 
     { 

      base.Initialize(requestContext); 
      // some stuff gets called here. 
     } 

第一件事就是服务层调用

public ServiceLayer() 
      : this(new Repository()) 
     { 

     } 

//具有另一个构造为DI。

因此,当我运行我的测试,并转到我的控制器,它继承这个基本控制器,一旦它击中我的控制器构造函数,它似乎调用此基本控制器。

所以在我的单元测试,我试图做这样的事情

baseController =新的ApplicationController(SerivceLayerInterface)来模仿主控制器;

我使用moq和东西来模拟serviceLayer接口中的存储库,但它似乎没有效果。

所以不知道该怎么做。

回答

3

而不是嘲笑你的基础控制器,为什么你不嘲笑服务层接口。例如,使用最小起订量,你可以这样做:

var serviceMock = new Mock<IServiceLayer>(); 
//serviceMock.Setup(s => s.SomeMethodCall()).Returns(someObject); 
var controller = new BaseController(serviceMock.Object); 

总的想法是,如果你测试你的控制器,你要嘲笑它的依赖。你想避免嘲笑你正在测试的东西。

+0

嗯。看到这是我一直在想我应该单独测试服务层?或者与控制器层一起使用?我之所以说这是很多我的服务层的东西,其中有验证方法。所以我认为不妨通过视图发送验证数据,然后测试最后的模型状态。因为大多数视图的东西只是将值传递给服务层,然后有几个if语句来检查验证是否成功,并根据服务层的结果返回正确的视图。 – chobo2 2009-10-05 05:43:33

+0

另外我发现的是我必须做很多嘲笑。有人告诉我,如果你嘲笑你做错了什么。然而,我不明白如何嘲笑它。就像几乎每个方法都从数据库调用某个方法一样,或者使用一些内置的asp.net成员函数(如User.Identity ...),如果不嘲笑它,似乎就会死掉。所以我只是不明白这是怎么回事。 – chobo2 2009-10-05 05:44:59

相关问题