method existiert nicht für dieses Mock-Objekt - Laravel, Mockery

Ich versuche, eine einfache Klasse zu testen. Ich verfolge dieses Tutorial http: //code.tutsplus.com/tutorials/testing-laravel-controllers--net-3145).

Ich habe diesen Fehler beim Ausführen von Tests:

Method Mockery_0_App_Interfaces_MealTypeRepositoryInterface::getValidator() does not exist on this mock object

Im mit Repository-Struktur. Mein Controller ruft also das Repository auf und das gibt die Antwort von Eloquent zurück.

Ich bin relativ neu in PHP und Laravel. Und ich habe vor ein paar Tagen angefangen, das Testen zu lernen, daher entschuldige ich mich für diesen chaotischen Code.

Mein Testfall:

class MealTypeControllerTest extends TestCase
{
public function setUp()
{
    parent::setUp();

    $this->mock = Mockery::mock('App\Interfaces\MealTypeRepositoryInterface');
    $this->app->instance('App\Interfaces\MealTypeRepositoryInterface' , $this->mock);
}
public function tearDown()
{
    Mockery::close();
}

public function testIndex()
{
    $this->mock
         ->shouldReceive('all')
         ->once()
         ->andReturn(['mealTypes' => (object)['id' => 1 , 'name' => 'jidlo']]);

    $this->call('GET' , 'mealType');

    $this->assertViewHas('mealTypes');
}

public function testStoreFails()
{
    $input = ['name' => 'x'];

    $this->mock
         ->shouldReceive('getValidator')
         ->once()
         ->andReturn(Mockery::mock(['fails' => true]));

    $this->mock
         ->shouldReceive('create')
         ->once()
         ->with($input);


    $this->call('POST' , 'mealType' , $input ); // this line throws the error

    $this->assertRedirectedToRoute('mealType.create');//->withErrors();

    $this->assertSessionHasErrors('name');
}

}

My EloquentMealTypeRepository: Nichts wirklich interessantes.

class EloquentMealTypeRepository implements MealTypeRepositoryInterface
{
public function all()
{
    return MealType::all();
}

public function find($id)
{
    return MealType::find($id);
}

public function create($input)
{
    return MealType::create($input);
}

public function getValidator($input)
{
    return MealType::getValidator($input);
}
}

Meine beredte Umsetzung: Auch nichts wirklich Interessantes.

class MealType extends Model
{
private $validator;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'meal_types';

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = ['name'];

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = [];

public function meals()
{
    return $this->hasMany('Meal');
}

public static function getValidator($fields)
{
    return Validator::make($fields, ['name' => 'required|min:3'] );
}
}

My MealTypeRepositoryInterface:

interface MealTypeRepositoryInterface
{
public function all();

public function find($id);

public function create($input);

public function getValidator($input);
}

Und schließlich My controller:

class MealTypeController extends Controller {
protected $mealType;

public function __construct(MealType $mealType)
{   
    $this->mealType = $mealType;
}


/**
 * Display a listing of the resource.
 *
 * @return Response
 */
public function index()
{
    $mealTypes = $this->mealType->all();
    return View::make('mealTypes.index')->with('mealTypes' ,$mealTypes);
}

/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create()
{
    $mealType = new MealTypeEloquent;
    $action = 'MealTypeController@store';
    $method = 'POST';

    return View::make('mealTypes.create_edit', compact('mealType' , 'action' , 'method') );     
}

/**
 * Validator does not work properly in tests.
 * Store a newly created resource in storage.
 *
 * @return Response
 */
public function store(Request $request)
{
    $input = ['name' => $request->input('name')];

    $mealType = new $this->mealType;

    $v = $mealType->getValidator($input);

    if( $v->passes() )
    {
        $this->mealType->create($input);
        return Redirect::to('mealType');
    }
    else
    {
        $this->errors = $v;
        return Redirect::to('mealType/create')->withErrors($v);
    }
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function show($id)
{
    return View::make('mealTypes.show' , ['mealType' => $this->mealType->find($id)]);
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function edit($id)
{
    $mealType = $this->mealType->find($id);
    $action = 'MealTypeController@update';
    $method = 'PATCH';
    return View::make('mealTypes.create_edit')->with(compact('mealType' , 'action' , 'method'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update($id)
{
    $mealType = $this->mealType->find($id);
    $mealType->name = \Input::get('name');
    $mealType->save();
    return redirect('mealType');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return Response
 */
public function destroy($id)
{
    $this->mealType->find($id)->delete();
    return redirect('mealType');
}

}

Das sollte alles sein. Es ist erwähnenswert, dass die Anwendung funktioniert, nur Tests sind vermasselt. Weiß jemand, warum das passiert? Ich kann keinen Unterschied zwischen den Methoden von TestCase - testIndex und testStoreFails sehen, warum die Methode "all" gefunden wird und "getValidator" nicht. Für Ratschläge bin ich dankbar.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage