2014-07-21 94 views
0

解決未定義的變量在使用PHPUnit進行測試的存儲()時laravel -4-

我有路由確實向商店一個POST路徑()在控制器中。

我試圖測試該動作是否正常工作。

控制器:

public function store() { 
    $d= Input::json()->all(); 

    //May need to check here if authorized 

    $foo= new Foo; 
    $d = array(); 
    $d['name'] = $d['name']; 
    $d['address'] = $d['address']; 
    $d['nickname'] = $d['nickname']; 



    if($foo->validate($d)) 
    { 
     $new_foo= $foo->create($d); 

     return Response::json(Foo::where('id','=',$new_foo->id)->first(),200); 
    } 
    else 
    { 
     return Response::json($foo->errors(),400); 
    } 
} 

現在,我想這一點使用一個名爲FooTest.php

這裏新類來測試目前我正在努力做,使檢查工作中的作用:

public function testFooCreation() 
{ 

    $jsonString = '{"address": "82828282", "email": "[email protected]", "name":"Tester"}'; 

    $json = json_decode($jsonString); 

    $this->client->request('POST', 'foo'); 

    $this->assertEquals($json, $this->client->getResponse()); 

} 

當我在我的cmd中運行phpunit時,出現錯誤,指出「名稱」未定義。我知道我並沒有將任何事情傳遞給請求,所以我肯定沒有任何事情正在被檢查,但我的問題是我如何確實通過我的JSON字符串來檢查?

每次我把$ json放在客戶端請求中,它會要求一個數組,但是當我將json字符串轉換爲數組時,json_decode需要一個字符串。

UPDATE

我與輸入數據的傳遞亂搞,我碰到這個傳來:

$input = [ 
     'name' => 'TESTNAME', 
     'address' => '299 TESTville', 
     'nickname' => 't' 
     ]; 


    Input::replace($input); 

    Auth::shouldReceive('attempt') 
     ->with(array('name' => Input::get('name'), 
        'address' => Input::get('address'), 
        'nickname' => Input::get('nickname'))) 
     ->once() 
     ->andReturn(true); 


    $response = $this->call('POST', 'foo', $input); 
    $content = $response->getContent(); 
    $data = json_decode($response->getContent()); 

但每當我運行測試,我仍然得到「名稱:未定義」這是仍然沒有通過我創建的輸入。

回答

1

我能夠將輸入傳遞到從測試POST路線。

public function testFooCreation(){ 

     $json = '{"name":"Bar", "address":"FooLand", "nickname":"foobar"}'; 

     $post = $this->action('POST', '[email protected]', null, array(), array(), array(), $json); 

     if($this->assertTrue($this->client->getResponse()->isOk()) == true && $this->assertResponseStatus(201)){ 

     echo "Test passed"; 
     } 

} 

原來,爲了讓我真正傳遞的投入,通過測試後的控制器中,我有過7參數傳遞給它。

我希望這可以幫助他人。

0
當然,你得到一個錯誤的

,只是看你的代碼

$aInputs = Input::json()->all(); 

    //May need to check here if authorized 

    $foo= new Foo; 
    $d = array(); 
    $d['name'] = $d['name']; 
    $d['address'] = $d['address']; 
    $d['nickname'] = $d['nickname'];

您指定數組它的自我,這是空

+0

爲什麼你打開另一個問題,問題是一樣的在http://stackoverflow.com/questions/24857763/testing-a-post-using-phpunit-in-laravel-4/24857916#24857916 – Klemen

+0

是的我澄清說,在我的答案當然是我得到一個錯誤。我的問題是,我如何實際做一個測試,通過示例輸入來檢查store()是否正在做它應該做的事情。 – sfas

+0

我打開了另一個問題,因爲這個問題在我正在尋找的過程中有點特別。另一個問題似乎有點草率。 – sfas

1
$d= Input::json()->all(); 

上面的語句獲取輸入在$ d。

$d = array(); 

現在最後聲明再次初始化$ d爲空的新數組

所以沒有:$ ['name']。因此,未定義。

我想,這是上述代碼的問題。

希望它能幫助:)

+0

正確。我知道,哈哈。我的問題不是實際上爲什麼我的'名字'是未定義的。我的問題是如何使用phpunit實際測試它。我想用store()的測試函數傳入數據,並檢查它是否真的有效。 – sfas

+0

檢查我的更新。也許我的問題會更清楚。 – sfas