16

To jest mój kod:Czy wdrażam ten prosty kontrakt nieprawidłowo?

public class RegularPolygon 
{ 
    public int VertexCount; 
    public double SideLength; 

    public RegularPolygon(int vertexCount, double sideLength) 
    { 
     Contract.Requires(vertexCount >= 3); 
     VertexCount = vertexCount; 
     SideLength = sideLength; 
    } 

    [ContractInvariantMethod] 
    private void RegularPolygonInvariants() 
    { 
     Contract.Invariant(VertexCount>=3); 
    } 

} 

Próbowałem zarówno z Contract.Requires i Contract.Invariant metod zapobiegających zmienną vertexCount z coraz mniejsza lub równa 2; jednak wciąż jestem w stanie zainicjować RegularPolygon z 2 lub mniej stronami. Mój (uproszczony) test NUnit wygląda następująco:

[TestFixture] 
class TestRegularPolygon 
{ 
    private RegularPolygon _polygon; 

    [SetUp] 
    public void Init() 
    { 
     _polygon = new RegularPolygon(1, 50); 
    } 

    [Test] 
    public void Constructor() 
    { 
     Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3)); 
    } 

} 

Powyższy test również mija i nie wiem dlaczego!

Na początku myślałem ReSharper mogło być brudząc coś ponieważ wyszarza linii i wyświetla ten komunikat gdy próbuję użyć metody w przestrzeni nazw Contract:

Metoda inwokacja jest pomijany. Kompilator nie wygeneruje wywołania metody, ponieważ metoda jest warunkowa lub jest metodą częściową bez implementacji.

Ale zawieszenie R # i uruchomienie testów w NUnit ma taki sam wynik, bez błędów i ostrzeżeń w VS. Zakładam, że dzieje się tak tylko dlatego, że ReSharper nie ma jeszcze zaznaczającej zgodności dla kontraktów kodu.

Przyjrzałem się dokumentacji i o ile wiem, nie powinienem mieć tego problemu.

Czy używam nieprawidłowych kontraktów kodu lub czy moje środowisko nie działa w jakiś sposób?

Dziękuję.

Odpowiedz

18

Pierwsza rzecz do sprawdzenia - czy rzeczywiście masz włączone sprawdzanie umowy? Jeśli nie, żadna z twoich umów nic nie da. To by wyjaśniało również ostrzeżenie R #. Sprawdź w "Właściwościach kompilacji" w "Właściwościach kompilacji" i zobacz, co mówi pod "Sprawdzanie w czasie wykonywania".

Zgodnie z uwagami, upewnij się, że masz CONTRACTS_FULL zdefiniowany jako symbol kompilacji - wydaje się, że R # tego wymaga.

Drugi punkt: masz pola zmienne publiczne, co oznacza, że ​​niezmienna mogą być naruszone w dowolnym momencie przez kogoś pisanie

polygon.VertexCount = 0; 

Proszę nie używać pól publicznych, zwłaszcza te, które nie do zapisania. :)

+0

Czy metoda niezmienna nie mogła tego złapać? Myślałem, że o to im chodzi. Powyższe nie jest moim kompletnym kodem, tylko przykładem do zademonstrowania mojego problemu. Jeśli po włączeniu sprawdzania umowy chodzi o przejście do właściwości projektu> Umowy z kodem> sprawdzanie statyczne/pełne sprawdzanie czasu wykonywania, tak, są one teraz włączone (nie były wcześniej), ale nadal mam ten sam problem. – Nobody

+0

@rmx: Metody niezmienne nie będą uruchamiane po zmianie pól. Jak mogli? Nie ma kodu, do którego mogliby się podłączyć, chyba że kod wywołujący został zmodyfikowany. Teraz, jeśli chodzi o posiadanie "tego samego problemu" - czy masz * wszystkie * te same objawy? Czy R # nadal wyszarza linię? –

+0

OK, anuluj to. Mam to działa. Moje niezmienne metody również musiały być prywatne. Nadal mam komunikat R # i wyszarzałem, ale nie ma to wpływu na funkcjonalność umów.Mam nadzieję, że naprawią to w następnym wydaniu. – Nobody

Powiązane problemy