2013-09-04 1 views
1

Я использую защиту в приложении grail. Версия Grails: 2.2.1 shiro: 1.2.0Как насмехаться с методом Siro accessControl() в тестовом примере блока Grails

У меня возникла проблема с написанием тестового примера блока Grails для контроллера с включенным фильтром. Когда тестовый файл работает без фильтров, он работает нормально, если он работает с фильтрами, тогда он не работает для метода accessControl(), который не найден в контроллере. Я не знаю, как сделать api Shiro видимым при запуске тестового примера. Я ссылался на ссылку на тестовый блок siro unit http://shiro.apache.org/testing.html, но я не смог получить информацию о accessControl(). Я дал образец кода, как выглядит мои классы и тестовый пример как

MyController.groovy

def create() { 
      // getting request parameters and validation 
      String emailId = params.emailId 
      def ret = myService.createUser(emailId) 

      return ret 
} 

MyControllerFilters.groovy

def filters = { 
       loginCheck(controller: 'user') { 
        before = { 
          //do some business checks 

          // Access control by convention. 
          accessControl() // This is a dynamic method injected by ShiroGrailsPlugin to FilterConfig, but this is not visible during the test case. 
         } 
       } 

MyControllerTests.groovy

@TestFor(MyController) 
@Mock(MyControllerFilters) 
class MyControllerTests { 

     @Before 
     void setup() { 
      // initializing some variables 
     } 

     void testCreateUserWithFilter() { 

      request.accessAllowed = true 

      withFilters(action:"create") { 
        controller.create() 
      } 

      assert response.message == "success" 
     } 
    } 

ответ

0

Попробуйте использовать:

ControllerOrService.metaClass.method = { 
    return "" //what you need to be returned 
} 

Добавить параметры закрытия, если метод принимать параметры:

ControllerOrService.metaClass.method = { def a, def b -> 
    return a + b 
} 

Не забудьте использовать полное имя метода, когда вы дразнить их таким образом.

+0

Этот метод accessControl() фактически не находится внутри контроллера, который вводится контроллеру во время выполнения. Этот метод принадлежит ShiroGrailsPlugin. Во время модульного теста этот метод не отображается внутри контроллера. Я не знаю, как вводить ShiroGrailsPlugin или какой-то макет этого метода для модульного теста – user2001627