Mam następujący kod do sprawdzenia, że po przekazaniu pewnej nazwy do mojej metody, rzuca wyjątek SQL (nie ma powodu do tego, choć brzmi to trochę dziwne).Moq i rzucając wyjątek SqlException
mockAccountDAL.Setup(m => m.CreateAccount(It.IsAny<string>(),
"Display Name 2", It.IsAny<string>())).Throws<SqlException>();
Jednak nie będzie to skompilować, ponieważ konstruktor SQLException jest wewnętrzny:
„System.Data.SqlClient.SqlException” musi być non-abstrakcyjny typ z konstruktora bez parametrów publicznego w celu używać go jako parametr „TException” w ogólnym typie lub metodzie „Moq.Language.IThrows.Throws()”
teraz mogę to zmienić, aby stwierdzić, że powinien rzucić Exception
, ale to by nie działało dla mnie, ponieważ moja metoda powinna zwrócić jeden kod stanu, jeśli jest to SqlException
, a drugi, jeśli jest jakikolwiek inny wyjątek. Właśnie to testuje mój test jednostkowy.
Czy jest jakiś sposób, aby to osiągnąć, nie zmieniając logiki metody, którą testuję, lub nie testując tego scenariusza?
możliwy duplikat [Jak rzucić wyjątek SqlException (potrzeba kpiny)] (http://stackoverflow.com/questions/1386962/how-to-throw-a-sqlexceptionneed- for-mocking) –
Możesz użyć Odbicie do dostęp do metody wewnętrznej CreateException, która pozwala utworzyć wyjątek SQLException. http://stackoverflow.com/questions/1259222/how-to-access-internal-class-using-reflection .... http://msdn.microsoft.com/en-us/library/ms229394(v=vs .100) .aspx ... po prostu zrób lamdę, aby ją utworzyć i wyrzucić. –