문자열에 PHPUnit의 다른 문자열이 포함되어 있는지 테스트하는 방법은 무엇입니까?
문자열이 다른 문자열에 포함되어 있는지 테스트하는 PHPUnit 에서 어설 션을 찾을 수없는 것 같습니다 . 다음과 같이 시도하십시오.
public function testRecipe() {
$plaintext = get_bread_recipe();
$this->assertStringContains('flour', $plaintext);
}
대신에 어떤 진짜 주장을 assertStringContains
할까요? 이 경우 정규식이 전혀 필요하지 않기 때문에 정규식에 대해 걱정할 필요가 없습니다.
너무 간단해서 내가 간과 한 것이있을 것 같지만 알아낼 수 없습니다! 충분히 재미 assertStringStartsWith()
있고 assertStringEndsWith()
!
업데이트 :strpos() !== false
사용할 수 있다는 것을 알고 있지만 더 깨끗한 것을 찾고 있습니다. 어쨌든 바닐라 PHP 함수를 사용한다면 모든 주장의 요점은 무엇입니까?
알 수 있듯이 assertContains
배열에 값이 포함되어 있는지 확인하는 것입니다.
문자열에 하위 문자열이 포함되어 있는지 확인하려면 가장 간단한 쿼리는 assertRegexp () 를 사용하는 것입니다.
$this->assertRegexp('/flour/', $plaintext);
구분 기호 만 추가하면됩니다.
정말로 assertStringContains
어설 션 을 갖고 싶다면 자신의 어설 션을 확장 PHPUnit_Framework_TestCase
하고 생성 할 수 있습니다.
최신 정보
최신 버전의 PHPUnit에서는 assertContains
문자열에서 작동합니다.
사용자 지정 어설 션 메서드 내에서 추악함을 항상 숨길 수 있으므로 기본적으로 재사용 가능한 어설 션 라이브러리를 사용하는 데 사용할 수있는 phpunit 테스트 케이스에서 상속되는 BaseTestCase 클래스가 있습니다 ( http://xunitpatterns.com/Custom 참조) . % 20Assertion.html ) .. (php 5.4에서는 트레이 트도 사용할 수 있습니다. imho assertion 라이브러리는 트레이 트 가 실제로 유용한 경우 중 하나입니다.) .. 저는 항상 제 프로젝트에 몇 가지 사용자 지정 어설 션을 소개합니다. 그리고 예, 일부는 추악합니다.) 음, 캡슐화가 필요한 것 같아요 ... 무엇보다도 ... :)
업데이트 : 방금 확인하고 'assertContains'와 'assertNotContains'는 실제로 문자열뿐만 아니라 배열 (및 'Traversable'을 구현하는 모든 것)에서도 작동합니다.
function test_Contains()
{
$this->assertContains("test", "this is a test string" );
$this->assertNotContains("tst", "this is a test string");
}
2019 및 PHPUnit 8.0 업데이트
assertContains()
PHPUnit 8.0부터 사용되지 않습니다 . 문제 # 3425를 참조하세요 .
이제 특정 방법이 권장됩니다 (참조 issue #3422
).
$this->assertStringContainsString('flour', $plaintext);
사용 가능한 일반 PHP 함수를 사용하여 문자열의 문자열을 수행 한 다음 assertEquals 그 출력을 수행 할 수 없습니까? 물론, 빛이 나지는 않지만 작동합니다.
또는 정규식과 함께 assertThat을 사용할 수 있습니다.
예제의 제한된 관점에서 볼 때 코드 / 테스트 디자인에 본질적으로 잘못된 것 같습니다. 함수가 길이를 알 수없는 복잡한 문자열을 반환하는 이유는 문자열에서 예상되는 비트가 '어딘가'인 이유는 무엇입니까?
테스트에서 입력을 제어 할 수 있어야하므로 예상되는 전체 출력 문자열을 알아야합니다. 함수가 문자열의 다른 부분을 망친다면이 단언은 그것에 대해 알려주지 않을 것입니다. 이것이 assertStringContains 함수가 존재하지 않는 이유 일 것입니다.
바닐라 PHP 함수를 포함하여 모든 것에 대해 단언을 할 수 있습니다. 테스트하려는 문자열에서 관심이있는 하위 문자열에 대한 strpos가 FALSE를 반환하지 않는다고 주장하면 요구 사항을 충족 할 것입니다.
그래도 FALSE에 대해 확인하고 0과 같이 FALSE로 평가되는 항목이 아닌지 확인하십시오 (테스트중인 문자열이 주어진 하위 문자열로 시작하는 경우 strpos가 반환하는 것입니다).
@Schleis에서 확장하면 더 복잡한 문자열이있는 경우 정규식을 이스케이프해야합니다.
$this->assertRegexp('/' . preg_quote('[some $stuff]') . '/', $plaintext);
또는 깔끔한 방법으로 마무리하십시오.
public function assertStringContains($needle, $haystack)
{
$this->assertRegexp('/' . preg_quote($needle) . '/', $haystack);
}
if (strpos($plaintext, 'flour') === false){
$this->fail("planintext should contain 'flour'");
}
'IT박스' 카테고리의 다른 글
특정 파일에서 pep8 오류를 비활성화하는 방법은 무엇입니까? (0) | 2020.12.07 |
---|---|
Firebase 연결 명확화 (0) | 2020.12.07 |
OkHttp 요청 본문을 기록하는 방법 (0) | 2020.12.07 |
Angular2 + http 간격 (0) | 2020.12.07 |
자바 스크립트에서 선행 및 후행 쉼표를 어떻게자를 수 있습니까? (0) | 2020.12.06 |