다음을 통해 공유


MSTEST0026: 어설션에서 조건부 액세스 방지

속성
규칙 ID MSTEST0026
제목 어설션에서 조건부 액세스 방지
범주 사용
수정 사항이 주요 변경인지 여부 주요 변경 아님
기본적으로 사용하도록 설정됨 예(3.5에서 3.7까지). 아니요(3.8부터 시작)
기본 심각도 정보
버전에서 도입됨 3.5.0
코드 수정이 있습니까? 아니요

원인

이 규칙은 null 조건부 연산자(?.) 또는 ?[]을(를) 포함하는 인수가 아래 어설션 메서드에 전달될 때 진단을 발생시킵니다.

  • Assert.IsTrue
  • Assert.IsFalse
  • Assert.AreEqual
  • Assert.AreNotEqual
  • Assert.AreSame
  • Assert.AreNotSame
  • CollectionAssert.AreEqual
  • CollectionAssert.AreNotEqual
  • CollectionAssert.AreEquivalent
  • CollectionAssert.AreNotEquivalent
  • CollectionAssert.Contains
  • CollectionAssert.DoesNotContain
  • CollectionAssert.AllItemsAreNotNull
  • CollectionAssert.AllItemsAreUnique
  • CollectionAssert.AllItemsAreInstancesOfType
  • CollectionAssert.IsSubsetOf
  • CollectionAssert.IsNotSubsetOf
  • StringAssert.Contains
  • StringAssert.StartsWith
  • StringAssert.EndsWith
  • StringAssert.Matches
  • StringAssert.DoesNotMatch

규칙 설명

단위 테스트에서 어설션의 목적은 특정 조건이 충족되는지 확인하는 것입니다. 조건부 액세스 연산자가 어설션에 사용되면 액세스되는 개체의 상태에 따라 충족되거나 충족되지 않을 수 있는 추가 조건이 도입됩니다. 이로 인해 테스트 결과가 일관되지 않고 테스트가 덜 명확해질 수 있습니다.

위반 문제를 해결하는 방법

어설션 메서드에 전달될 때 인수에 (?.) 또는 ?[]이(가) 포함되어 있지 않은지 확인합니다. 대신, 어설션을 하기 전에 null 검사를 수행합니다.

Company? company = GetCompany();
Assert.AreEqual("Contoso", company?.Name); // MSTEST0026
StringAssert.Contains(company?.Address, "Brazil"); // MSTEST0026

// Fixed code
Assert.IsNotNull(company);
Assert.AreEqual("Contoso", company.Name);
StringAssert.Contains(company.Address, "Brazil");

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시하지 않는 것이 좋습니다.

경고 표시 안 함

단일 위반을 억제하려면 소스 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 다음 다시 활성화하십시오.

#pragma warning disable MSTEST0026
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0026

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 하려면 none에서 해당 심각도를 으로 설정하세요.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0026.severity = none

자세한 내용은 코드 분석 경고표시하지 않는 방법을 참조하세요.