2016-08-07 6 views
0

을 반영하지 :열 업데이트는 다음 테스트가 실패

/** @test */ 
public function set_shift_on_given_availability_to_a_candidate() 
{ 
    $candidate = $this->createCandidateWithFixedAvailability(pow(2, 3) - 1); 
    $candidate->availabilities[0]->setShift(App\Availability::SHIFT_TYPES['AM']); 
    $candidateShifts = $candidate->availabilities[0]->shifts; 

    $this->assertEquals(count($candidateShifts), 1); 
    $this->assertTrue(in_array('AM', $candidateShifts)); 
} 

내가 장인 어설프게와 방법을 사용하려고 할 때 내가 예상 결과를 얻을 : 사용 방법

>>> $candidate->availabilities()->first()->shifts(); 
=> [ 
    "AM", 
    ] 
>>> $candidate->availabilities()->first()->setShift(App\Availability::SHIFT_TYPES['PM']); 
=> null 
>>> $candidate->availabilities()->first()->shifts(); 
=> [ 
    "PM", 
    ] 

구현 세부 사항 :

public function setShift(...$shiftTypes) 
{ 
    \DB::table($this->table) 
     ->where([ 
      ['candidate_id', '=', $this->candidate_id], 
      ['day_of_week_id', '=', $this->day_of_week_id] 
     ]) 
     ->update(['shifts' => array_sum ($shiftTypes)]); 
} 

public function shifts() 
{ 
    $namedShifts = []; 
    foreach (Availability::SHIFT_TYPES as $key => $val) { 
     if($this->shifts & $val) { 
      array_push($namedShifts, $key); 
     } 
    } 
    return $namedShifts; 
} 

DatabaseTransactions 특성으로 별도의 테스트 데이터베이스를 사용하고 있습니다. 열심히 노력하고있는 동안 내 단위 테스트에서 시프트()와 함께 열 값을 가져 오려고 할 때 왜 업데이트가 열 값을 변경하지 않는지 이해할 수 없습니다.

DB 쿼리 빌더를 사용하여 열을 업데이트 한 다음 해당 열의 동적 속성을 가져 오지 않아도 변경 내용이 반영되지 않으므로 쿼리 작성기를 사용하여 가져 오거나 다음과 같이 시프트 값을 할당합니다. 업데이트가 성공적으로 실행될 때 setShift 함수의 동적 속성 동적 속성이 phpunit가 아니라 tinker에서 올바르게 업데이트된다는 것은 이상한 일입니다.

+0

)

자,이 모든 꽤 투기 순전히 나 자신이 과거에 실행 발견 된 오류에 기반 필자가'$ candidate-> availabilities()'를 사용하고 있다면, 테스트에서'availabilities'가 적절하게 설정되지 않았을 것입니다. (예를 들어,'candidate_id'가 없다면 아마도 조건이 실패하는'[ 'candidate_id', '=', $ this-> candidate_id] '' '';;;;;;;;;;;;;;;;;;;;;;;;;; 그것은 내 편이 많은 가정이다.) – Hirnhamster

+0

나는 변화를 만들었고 효과가있다. [0]과 first()가 둘 다 동일한 App \ Availability 모델에 대한 참조를 반환하는 것으로 보이는 이유를 이해할 수 없습니다. 답변을 작성하고 왜 이런 일이 발생했는지에 대한 정보를 조금 더 제공하면 기꺼이 답변을 수락 할 수 있습니다. 도와 주셔서 감사합니다! –

답변

1

테스트 설정과 팅커 예제의 주요 차이점은 $candidate->availabilities()->first()$candidate->availabilities[0]입니다.

$candidate->availabilities()은 아마도 HasMany 관계를 반환하도록 설정됩니다. 따라서 $candidate->availabilities()->first()을 호출하면 데이터베이스에서 SQL 문을 직접 실행할 수 있습니다.

$candidate->availabilities[0]availabilities 관계를 해결합니다. 이것은 "부작용"을 가질 수 있습니다. 관계가 이미 설정되어 DB에 대한 "신선한"호출이 트리거되지 않기 때문입니다. $this->createCandidateWithFixedAvailability(pow(2, 3) - 1);이 의도 한대로 작동하지 않는다고 생각합니다. 실제로 올바르게 저장하지 않고 availabilities을 생성하여 특정 속성이 설정되지 않은 것일 수 있습니다. 이 시나리오의 일반적인 오류는 관계 값이 누락 된 것입니다 (예 : availability 엔티티의 candidate_id 속성이 설정되지 않음). 당신이> 이용 가능성 [0]`에서 반면`$ candidate-를 사용하는 테스트 코드에서

관련 문제