Tôi đang cố gắng kiểm tra hành động của bộ điều khiển cho phép ấn bản hồ sơ người dùng. Trong số những thứ khác tôi muốn kiểm tra rằng mọi người dùng đã đăng nhập chỉ có thể chỉnh sửa hồ sơ của riêng mình chứ không phải của người khác. Trong trường hợp phá vỡ hạn chế này, hành động phải chuyển hướng đến trang chủ được xác định trước.Viết kiểm tra đơn vị cho bộ điều khiển sử dụng AuthComponent trong CakePHP 2
Với kịch bản này, tôi có một vật cố tạo ra một người dùng với ID = 1. Vì vậy, tôi đã suy nghĩ về thử nghiệm hạn chế theo cách này:
$data = $this->Users->User->read(null, 1);
$this->Users->Auth->login($data);
$this->testAction('/users/edit/2', array('method' => 'get'));
$url = parse_url($this->headers['Location']);
$this->assertEquals($url['path'], '/homepage');
Bài kiểm tra qua khẳng định này. Vì vậy, bước tiếp theo là kiểm tra xem thực '/users/edit/1'
, trong đó có ID của người dùng đăng nhập, cho thấy các hình thức:
$this->testAction('/users/edit/1', array('method' => 'get', 'return' => 'vars'));
$matcher = array(
'tag' => 'form',
'ancestor' => array('tag' => 'div'),
'descendant' => array('tag' => 'fieldset'),
);
$this->assertTag($matcher, $this->vars['content_for_layout'], 'The edition form was not found');
Tuy nhiên khẳng định này không thành công. Sau khi đào bới xung quanh với debug()
Tôi đã tìm thấy rằng $this->Auth->user()
trả về toàn bộ thông tin nhưng $this->Auth->user('id')
trả lại null
. Vì tôi sử dụng sau này trong một so sánh trong hành động, nó đánh giá là sai và gây ra các thử nghiệm thất bại.
Điều kỳ lạ là nó xảy ra khi thử nghiệm nhưng không xảy ra khi thực hiện tác vụ trong trình duyệt. Vì vậy, cách chính xác để thử nghiệm hành động này là gì?
Cảm ơn!
Vậy thì điểm của việc sử dụng 'ControllerTestCase' là gì nếu bạn phải sử dụng' generate() '? – elitalon
generate() chỉ có sẵn trong ControllerTestCase và nó được cung cấp để làm cho testAction của bạn() dễ dàng hơn, chẳng hạn như có thể giả lập các phương thức điều khiển, các thành phần, mô hình, v.v. Nếu bạn không gọi generate(), thì testAction () sẽ làm điều đó nội bộ cho bạn với các giá trị mặc định của CakePHP (mocking _stop() và hàm redirect()) –
Tôi nghĩ 'generate()' thực sự đã làm một cái gì đó khác. Đó là lý do tại sao tôi cứ nghĩ tại sao lại sử dụng nó nếu 'ControllerTestCase' cung cấp cho tôi một cấu hình mặc định. Tôi sẽ thử câu trả lời của bạn và cho bạn biết :) – elitalon