2013-03-09 16 views
5

Widziałem kilka przykładowych aplikacji Sitecore, który wykorzystuje kod poniżej ciągu logika biznesowa:Sitecore - Assert.IsNotNull

Database database = Factory.GetDatabase(itemUri.DatabaseName); 
Assert.IsNotNull(database, itemUri.DatabaseName); 
return database.GetItem(attribute); 

Może ktoś proszę wyjaśnić, czy jest to konwencja Sitecore. Użyłem tylko Assert do scenariuszy testów jednostkowych, ale nie w ramach logiki.

Dzięki.

Odpowiedz

5

Jest to konwencja, którą można zobaczyć na stronie internetowej sitecore.dll. Służy do zgłaszania wyjątku, jeśli ten warunek nie jest spełniony.

Na przykład, jeśli spojrzeć na Assert.IsTrue, jeśli warunek nie jest spełniony system będzie rzucać „InvalidOperationException”

De-kompilacji metodę z Search API znalazłem to.

Assert.IsTrue(local_0 != null, "SearchConfiguration is missing"); 

Następnie jeśli de-kompilacji IsTrue, daje nam

[AssertionMethod] 
public static void IsTrue([AssertionCondition(AssertionConditionType.IS_TRUE)] bool condition, string message) 
{ 
    if (!condition) 
    throw new InvalidOperationException(message); 
} 

Aby odpowiedzieć na to inne pytanie można użyć tego w kodzie aplikacji, jak widać jej tylko inny sposób rzucania wyjątek, jeśli warunek nie jest spełniony.

Zamieszanie przychodzi z użyciem słowa "assert", które, jak powiedziałeś, jest zwykle postrzegane w kontekście testów jednostkowych w tradycyjnym rozwiązaniu C# .NET. Tak długo, jak wiesz, co za scenariuszem Sitecore robi za kulisami, zależy to od Ciebie, czy chcesz z niego korzystać, czy nie.

8

Znalazłem this article, który zawiera większość Twojego pytania. Istnieje kilka ważnych punktów:

  • . Assert .NET nie jest tym samym co Assert Sitecore. Co najmniej, Assert Sitecore jest o wiele bardziej gadatliwy.
  • Uważa się, że najlepszą praktyką w Sitecore jest używanie Asserts do sprawdzania danych wejściowych metody. (A znajdziesz te twierdzi konsekwentnie w kodzie Sitecore i kod w Sitecorecommunity (nie mogę powiedzieć, jak irytujące Pole jest zerowy może być.))

myślę, ważne jest również, aby pamiętać, że wiele przykładów, które wydaje mi się znaleźć na blogach Sitecore, to przypadki, w których i tak miałby miejsce wyjątek. Tak więc, gdyby pominąć na przykład ArgumentIsNotNull, mogłoby to spowodować NullObjectException, więc aserktus faktycznie trochę wyczyści rzeczy. W twoim przypadku, jeśli baza danych jest niedostępna, może to również spowodować problem. Ansert sprawia, że ​​przyczyna błędu jest jasna.

+3

Warto zauważyć, że "System.Diagnostics.Debug.Assert" jest warunkowe i będzie uruchamiane tylko w kompilacjach DEBUG aplikacji. Sitecore.Assert nie ma takich ograniczeń, więc wywoła wyjątek InvalidOperationException, gdy warunek testu nie powiedzie się w obu kompilacjach DEBUG i RELEASE. –

+0

Czy możesz wyjaśnić "Assert czyści trochę rzeczy". Czy to oznacza, że ​​wyjątek jest spuchnięty. Nadal nie widzimy powodu, dla którego tego potrzebujemy. –

+0

Jak mówi Kevin, nie chcesz polegać tylko na dowodach. Assert ma na celu omówić przypadki, które mogą pomóc w trakcie testowania, takie jak brak zasobów lub wartość, która nie powinna mieć wartości zerowej. Nadal należy używać sprawdzania poprawności i wyjątków oraz obsługi wyjątków dla kodu produkcyjnego, ponieważ asserts nie działają w kompilacji wydania. Są pomocne podczas testowania, ponieważ są szybkie w dodawaniu i mogą dostarczyć więcej informacji przy niewielkim wysiłku. –