Witam,
chciałbym poprosić bardziej doświadczonych o pomoc w poprawnym zrozumieniu idei testów jednostkowych (unit tests) ponieważ momentami wydają mi się one pozbawione sensu :/
Mamy przykładową metodę w serwisie:
public string GetFile(long fileId)
{
using (var db = new ApplicationDbContext())
{
try
{
string source = db.File.FirstOrDefault(x => x.id_file == fileId)?.file_path;
string destination = System.Web.HttpContext.Current.Server.MapPath("~/Temporary");
if (Directory.Exists(destination) && File.Exists(source))
{
string randomName = Path.GetRandomFileName().Replace(".","") + ".jpg";
File.Copy(source, destination + "\\" + randomName);
return "http://" + System.Web.HttpContext.Current.Request.UrlReferrer.Host + ":" +
System.Web.HttpContext.Current.Request.UrlReferrer.Port + "/Temporary/" + randomName;
}
else
{
throw new Exception("Nie można znaleźć pliku źródłowego ("+source+") i/lub folderu docelowego ("+destination+").");
}
}
catch (Exception ex)
{
return "";
}
}
}
Metoda ta pobiera ścieżkę do pliku na podstawie jego id, kopiuje do folderu tymczasowego i zwraca url do tejże kopii.
Teraz chcę napisać test do tej metody, ale ... co ja mogę na dobrą sprawę tutaj przetestować? Napisałem coś takiego:
[TestClass]
public class FileServiceTest
{
private Mock<IFileService> _service;
[TestInitialize]
public void Initialize()
{
_service = new Mock<IFileService>();
}
[TestMethod]
public void GettingFileTempWithSuccess()
{
//Act
string path = _service.Object.GetFile(It.IsAny<long>());
//Assert
Assert.AreNotEqual("", path);
}
}
Ten test sprawdzi czy dla dowolnej wartości typu long
moja metoda zwróci mi jakąś ścieżkę. Ale co ten test mi daje skoro inaczej być nie może (tzn. może np. nie istnieć plik, albo folder Temporary, ale tego moja metoda testowa już nie sprawdzi), a jeżeli kiedyś zmienię metodę i np. będę przekazywał wartości double
(wiem, że w tym przypadku to nie możliwe, ale dla innych funkcji już jak najbardziej) to i tak kod mi się wysypie podczas próby zbuildowania projektu, bo wtedy próbowałbym przyrównać w 7 linii mojej metody wartość long
z tablicy bazy danych do parametru double
- tak czy siak zostałbym poinformowany o tym błędzie i bym go musiał poprawić. Po co mi zatem moja metoda testowa? Gdzie tu jest ta wartość dodana, dla której warto poświęcić czas i testy mimo wszystko napisać?
Dziękuję za czas poświęcony na przeczytanie mojego posta i ewentualne podpowiedzi :)