문제

복잡한 과학 계산을 보유하고있는 수업이 있습니다. 사용자가 올바르게 인스턴스화 된 케이스를 만들 수 있도록 설정됩니다. 그러나 코드를 올바르게 테스트하려면 참조 문서가 테스트 사례 에이 데이터를 제공하기 때문에 내부 상태 변수를 직접 설정해야합니다. 그러나 부적절하게 완료되면 상태를 무효화 할 수 있습니다.

따라서 단위 테스트 프로그램에서 내부 변수를 설정하는 능력, 멤버 기능이 있어야합니다. 그러나 나는 원한다 강력하게 낙담합니다 이 기능을 호출하는 일반 사용자. (예, 결정된 사용자는 무엇이든 멍청 할 수 있지만 ... 공시 하다 무언가를 할 수있는 방법이 있다는 것입니다 잘못된.)

예를 들어 Intellisense에게 기능을 표시하지 말라고 말할 수있어서 좋을 것입니다.

내가 가진 가장 좋은 솔루션은 다음과 같은 기능의 이름을 다음과 같은 기능으로 지정하는 것입니다. Dangerousset ().

다른 옵션은 무엇입니까?

후속 조치

나는 David B의 답변이 내 상황에 가장 유용하다는 것을 알았습니다. 감사!
반사를 사용하겠다는 Mufasa의 제안은 훌륭했지만 구현하기가 더 어려웠습니다 (나를 위해).
데코레이터를 사용하겠다는 Chris의 제안은 좋았지 만 팬이 튀어 나오지 않았습니다.
XML에 대한 BFREE의 제안도 좋았으며 이미 사용 중이지만 실제로 문제를 해결하지는 않습니다.

마지막으로, Billthelizard의 문제가 소스 문서에 있다는 제안은 제가 제어 할 수있는 것이 아닙니다. 국제 전문가들은 지역 사회에서 사용할 고도로 기술적 인 책과 저널 기사를 출판합니다. 그들이 내 특별한 요구를 다루지 않는다는 사실은 삶의 사실입니다. 대체 문서는 없습니다.

도움이 되었습니까?

해결책

필드를 조작 하여이 객체를 테스트하려고한다고 가정하십시오.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

이 객체를 테스트 어셈블리/네임 스페이스에 배치하십시오.

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

그리고 시험 작성 :

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

추신 : 나는 당신이 말한 것을 압니다 내부, 그러나 나는 당신이 의미한다고 생각하지 않습니다 내부.

다른 팁

당신이 사용할 수있는 InternalSvisibleToattribute 내부 멤버를 테스트 어셈블리에 보이는 것으로 표시합니다. "친구"는 아니지만이 맥락에서 사용될 때 빛나는 것 같습니다.

  1. 당신을 표시하십시오 DangerousSet 기능 internal 대신에 public.

  2. 포함 된 프로젝트의 속성 AssemblyInfo.cs DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

어떤 이유로 든 두 개의 테스트 어셈블리가있는 경우 구문은 다음과 같습니다.

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

이 속성으로 메소드를 장식하십시오.

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

이것은 Intellisense에서 그것을 숨길 것입니다.

편집하다:

그러나 분명히 이것은 다소 중요한 경고를 가지고 있습니다. "Visual C#, EditorBrowsableAttribute 같은 어셈블리에서 수업에서 회원을 억제하지 않습니다. " MSDN을 통해.

실제 문제가 참조 문서에있는 것 같습니다. 수업을 올바르게 사용하면 발생하는 경우가 불가능한 사례를 테스트해서는 안됩니다. 사용자가 해당 변수의 상태를 변경하지 않아야하는 경우 테스트를 수행하지 않아야합니다.

반사를 사용할 수도 있습니다. Google 검색이 나타났습니다 반사를 사용하여 개인 방법을 테스트합니다.

테스트 코드에 계산 클래스의 서브 클래스가 포함될 수 있습니까? 그렇다면 함수를 표시 할 수 있습니다 protected 그리고 상속인 만 사용할 수 있습니다. 나는 이것이 또한 Intellisense에서 그것을 꺼내는 것을 확신하지만, 나는 그것에 대해 잘못 될 수 있습니다.

과거에 한 일은이 방법에 따라 XML 댓글을 넣고 섹션을 사용하여 큰 대담한 글자로 작성하는 것입니다. 이 방법이나 다른 방법을 사용하지 마십시오. 그렇게하면 누군가가 그것을 사용하려고한다면 Intellisense는 그들에게 좋은 경고를 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top