У меня есть класс домена, который выглядит следующим образом:
public class Employee
{
public Guid EmployeeId { get; private set; }
public string Name { get; private set; }
public string Surname { get; private set; }
...
// other properties
public ICollection<Language> Languages { get; private set; }
= new List<Language>();
public ICollection<Skill> Skills { get; private set; }
= new List<Skill>();
public void AddLanguage(Language language)
{
if (language == null)
return;
Languages.Add(language);
}
public void DeleteLanguage(Guid languageId)
{
var languageToDelete = Languages
.SingleOrDefault(x => x.LanguageId == languageId);
if(languageToDelete == null)
throw new ArgumentException("Language entry doesn't exist.");
Languages.Remove(languageToDelete);
}
}
Я хотел бы протестировать данные методы, но я застрял.
У меня есть:
[Fact]
public void AddLanguage_AfterCallWithValidObject_LanguagesCollectionContainsAddedObject()
{
var language = new Mock<Language>();
var employee = new Employee("Name", "Surname", ...);
employee.AddLanguage(language.Object);
Assert.Contains(employee.EmployeeLanguages, x => x.Language.Equals(language.Object));
}
[Fact]
public void DeleteLanguage_WhenLanguageWithGivenIdDoesntExist_ThrowArgumentException()
{
var languageToDelete = new Language("English");
var employee = new Mock<Employee>();
employee.Setup(x => x.Languages).Returns(new List<Languages>
{
new Language("Spanish"),
new Language("German")
});
employee.Object.DeleteLanguage(languageToDelete);
// Asserts here
}
В первом тесте я также хотел бы заявить, что Languages.Add (skill) метод был вызван, но я не знаю, как это сделать.
- Этоэлегантный способ сделать это?Я думал о насмешливом методе Add , но я не уверен, что это хорошая идея.
Во втором тесте я не могу просто насмехаться над объектом Employee как это не интерфейс.Я думал о разоблачении Employee , но я прочитал, что не следует делать это только для целей тестирования.
Как мне высмеивать свойство
Languages , не раскрывая
Employee в качестве интерфейса?Является ли это возможным?Это хорошая практика, чтобы делать такие вещи? Является ли моя общая концепция для тестирования этих методов в порядке?(Я новичок в модульном тестировании)