Rozumiem, to może zapytam jeszcze :D. Czy jeżeli w celu przetestowania metody:
public User GetFromDb(AccessVM access, ConnectionStrings con)
{
using var c = new SqlConnection(con.GetConnectionString());
return c.QueryFirstOrDefault<User>(Sql.GetUserByIndentity, access, commandTimeout: 3000);
}
No tu by należało sobie zadać przede wszystkim pytanie czemu ta metoda nie jest statyczna, albo czemu w ogóle jest w klasie User
, czy VM
w AccessVM
oznacza view model, a jeśli tak, to co to robi w klasie User
, czemu SQLConnection jest tworzone w takim miejscu i nigdy nie zamykane? Jeśli to miał być active record to nie wyszedł, ale to nawet lepiej, bo nawet jak wyjdzie, to będzie szyszką w tyłku.
napiszę takie testy:
[Test]
[TestCase("testFalse", "5560", "ABC", "123", null)]
[TestCase("test", "5566", "1252", "5258", null)]
[TestCase("test22", "5585", "1252", "a", null)]
public void GetFromDb_IncorrectData(string user, string pin, string sn, string imei, Type expectedResult)
{
var result = new User().GetFromDb(
new AccessVM(user, pin, sn, imei),
new ConnectionStrings() { TST = "Server=tsql;Database=dm_logic_gci;User Id=tech_teren;Password=***;" });
Assert.AreEqual(result, expectedResult);
}
[Test]
[TestCase("test", "5560", "ABC", "123", typeof(User))]
public void GetFromDb_CorrectData(string user, string pin, string sn, string imei, Type expectedResult)
{
var result = new User().GetFromDb(
new AccessVM(user, pin, sn, imei),
new ConnectionStrings() { TST = "Server=tsql;Database=dm_logic_gci;User Id=tech_teren;Password=***;" });
Assert.AreEqual(result.GetType(), expectedResult);
}
To zbliżę się chociaż do prawidłowego tworzenia tych testów (zdaję sobie sprawę, że to już jest test integracyjny).
A co takie testy dadzą? Czy uchronią przed jakimś błędem? Czy sprawią, że refaktoryzacja będzie możliwa? Czy pokażą, że kod działa?
Jak dla mnie, to żadne z tych trzech.
Umiem sobie wyobrazić test integracyjny dla warstwy dostępu do danych, w którym najpierw zapisujesz coś do bazy przez swoją klasę, a potem odczytujesz, i sprawdzasz, czy dane odczytane są zgodne z zapisanymi. W ten sposób sprawdzasz, czy niczego nie popsułeś np. w mapowaniu z obiektów na tabele albo odwrotnie. Taki test potencjalnie coś mógłby dać, ale w tym Twoim, to naprawdę nie widzę jak. Co da sprawdzenie typu zwróconego obiektu?
Czy za użycie NUnita do napisania testu który nie jest jednostkowy będę się smażył w piekle :D?
Trochę nie rozumiem pytania. Testy w C# pisze się na ogół w NUnit albo XUnit, ewentualnie MSTest. Chyba nawet nie znam innych frameworków. Różnica między testem integracyjnym, a jednostkowym leży w tym, co on robi, a nie w jakim frameworku powstał.
Jeżeli select nie zwróci nic to obiekt będzie nullem i result.GetType() wyrzuci NullReferenceException.
A więc wystarczy sprawdzić, czyresult
jest null
.