문자열에 PHPUnit에 다른 문자열이 포함되어 있는지 테스트하는 방법
PHUnit에서 단순히 문자열이 다른 문자열에 포함되어 있는지 테스트하는 어설션을 찾을 수 없습니다.다음과 같은 작업을 시도합니다.
public function testRecipe() {
$plaintext = get_bread_recipe();
$this->assertStringContains('flour', $plaintext);
}
어떤 진짜 주장을 내세울까?assertStringContains
이 경우 regex는 전혀 필요 없기 때문에 걱정할 필요가 없습니다.
너무 간단해서 뭔가 간과한 게 있을 텐데 도저히 이해가 안 가네요!웃기다assertStringStartsWith()
그리고.assertStringEndsWith()
!
업데이트: 알고 있습니다.strpos() !== false
좀 더 깨끗한 걸 찾고 있어요.만약 내가 바닐라 PHP 함수를 사용한다면 모든 어설션의 요점은 무엇입니까?
아시겠지만assertContains
배열에 값이 포함되어 있는지 확인하기 위한 것입니다.
문자열에 서브스트링이 포함되어 있는지 여부를 확인하는 가장 간단한 쿼리는 assertRegexp()를 사용하는 것입니다.
$this->assertRegexp('/flour/', $plaintext);
딜리미터를 추가하면 됩니다.
만약 당신이 정말 갖고 싶다면assertStringContains
assertion, 확장 가능PHPUnit_Framework_TestCase
자신만의 것을 만들 수 있습니다.
갱신하다
최신 버전의 PHPUnit에서는assertContains
스트링으로 동작합니다.
커스텀 어설션 메서드 내에서는 항상 추악함을 숨길 수 있기 때문에 기본적으로는 재사용 가능한 어설션 라이브러리를 보유하기 위해 사용할 수 있는 phpunit 테스트 케이스에서 상속된 BaseTestCase 클래스가 필요합니다(http://xunitpatterns.com/Custom%20Assertion.html) 참조).(php 5.4에서는 imho 어설션 라이브러리는 특성이 실제로 도움이 되는 경우 중 하나입니다.)저는 항상 제 프로젝트에서 상당히 많은 사용자 정의 주장을 도입합니다. 종종 도메인마다 다릅니다.네, 못생긴 것도 있습니다:) 음, 그래서 캡슐화가 있는 것 같아요.그 중에서도...:)
업데이트: 방금 확인했는데, 'assert Contains'와 'assert Not Contains'는 문자열 및 어레이(및 '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 참조).
다음으로 특정 방법을 권장합니다( 참조).
$plaintext = 'I fell on the flour';
$this->assertStringContainsString('flour', $plaintext);
힌트: Rector 및 PHPUnit 8.0을 설정하면 즉시 업그레이드 할 수 있습니다.
Vanilla PHP 함수를 포함한 모든 것에 대해 단언할 수 있습니다.테스트하고 있는 문자열에서 관심 있는 서브스트링의 스트포스가 FALSE를 반환하지 않는다고 단언하면 요구를 충족시킬 수 있습니다.
단, 0과 같이 FALSE로 평가되는 것이 아니라 FALSE에 대해 체크하고 있는지 확인하십시오(테스트 대상 문자열이 지정된 하위 문자열로 시작하는 경우 strpos가 반환됩니다).
@Schleis에서 확장하면 더 복잡한 문자열이 있는 경우 regex를 이스케이프해야 합니다.
$this->assertRegexp('/' . preg_quote('[some $stuff]') . '/', $plaintext);
또는 보다 깔끔한 방법으로 정리합니다.
public function assertStringContains($needle, $haystack)
{
$this->assertRegexp('/' . preg_quote($needle) . '/', $haystack);
}
사용할 수 있는 일반 PHP 함수를 사용하여 문자열 내의 문자열을 수행한 후 assertEqual로 출력할 수 없습니까?네, 반짝이지는 않지만 효과가 있어요.
또는 assert를 사용할 수 있습니다.그건 규칙적인 표현으로.
이 예제의 제한된 관점에서 보면 코드/테스트 설계에 본질적으로 문제가 있는 것 같습니다.함수가 길이를 알 수 없는 복잡한 문자열을 반환하고 문자열에 예상 비트가 'something'인 이유는 무엇입니까?
테스트에서는 입력을 제어할 수 있어야 하므로 예상되는 출력 문자열 전체를 알아야 합니다.만약 당신의 기능이 문자열의 다른 부분을 망가뜨린다면, 이 주장만으로는 알 수 없습니다.그렇기 때문에 assertStringContains 함수는 존재하지 않을 수 있습니다.
언급URL : https://stackoverflow.com/questions/24015943/how-to-test-if-string-contains-another-string-in-phpunit
'programing' 카테고리의 다른 글
Student Data txt 파일 내의 데이터를 읽고 학생의 평균을 계산하려면 어떻게 해야 합니까?또한 구조물을 통해 스위치로 전송합니다. (0) | 2022.10.20 |
---|---|
Regex를 사용하여 파일을 해석해야 합니까, 아니면 더 나은 방법이 있습니까? (0) | 2022.10.20 |
로드밸런싱을 위한 올바른 MariaDB Galera jdbc URL 속성은 무엇입니까? (0) | 2022.10.20 |
mysql dump - 일부 테이블 데이터를 제외합니다. (0) | 2022.10.20 |
Java에 제네릭이 재작성되지 않은 것을 왜 신경써야 합니까? (0) | 2022.10.20 |