-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Попов Захар #29
base: master
Are you sure you want to change the base?
Попов Захар #29
Conversation
1. Тест CheckCurrentTsar переписан с использованием методов FluentAssertions. Его читаемость повысилась за счёт методчейнинга, а при добавлении новых полей в класс Person, сам тест не нужно изменять. 2. Получение экземпляра текущего царя вынесено в отдельный метод.
Проведён рефакторинг тестов. Добавлены новые тесты.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Просто рекомендация к PR
Это не нужно править
Сейчас у тебя Pull Request создан из ветки master
твоего репозитория, в целом допустимо, но тем самым могут возникнуть проблемы при сихронизации ветки master
, когда будешь делать pull из основного репозитория.
Если в основном репозитории появились новые коммиты, то в твоей ветке master
будет создан merge commit, который появится в этом PR. Таким образом, пока активен PR, не будет возможности что-то сделать с master
веткой форка.
Из этих соображений, лучше создавать в форке отдельную ветку для Pull Request. Это позволит легко вносить изменения в PR и не получать нежелательных конфликтов. Будут только желательные конфликты, хех :)
/* Какие недостатки у такого подхода? | ||
|
||
Основным недостатком данного подхода я считаю необходимость | ||
изменения метода AreEqual при добавлении новых полей класса Person. | ||
Например, если мы добавим в Person поле Gender(пол), | ||
то нам нужно будет в AreEqual так же ручками добавить | ||
проверку совпадения полов: | ||
actual.Gender == expected.Gender. | ||
*/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Может быть есть ещё недостатки?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предположу, что так же недостатком является то, что данный метод является рекурсивным и возможна ситуация, при которой цепочка из царей превысит глубину рекурсии. Знаю, что это одна из проблем питона - малая глубина рекурсии по умолчанию. Шарп вроде за таким не замечен. Так же будет забиваться стек вызовов методов. Будут накладные расходы на постановку/снятие контекста метода в/из стек вызовов.
Я сам вообще не люблю писать рекурсивные методы, хоть они и придают порой элегантность коду. В подавляющем большинстве случаем пишу с использованием цикла. Мне кажется это нагляднее.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Действительно, для большой вложенности могут возникнуть проблемы с конечным стеком потока. Но лишино ли решение с Fluent Assertions такой проблемы? Там точно цикл внутри а не подобная рекурсия?
Кроме того, конкретно при тестировании прошлая запись тестов имеет ряд других, более значимых недостатков, хотелось бы услышать их
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если я всё правильно понял, то исходя из документации, решение с Fluent Assertions на самом деле так же рекурсивно. По умолчанию глубина рекурсии выставлена как 10.
The comparison is recursive by default. To avoid infinite recursion, Fluent Assertions will recurse up to 10 levels deep by default, but if you want to force it to go as deep as possible, use the AllowingInfiniteRecursion option.
По недостаткам решения, могу ещё предложить следующее:
- Нет конкретики, какое поле оказалось разным, просто сообщается о том, что цари различаются.
- Если мы передаём оба царя как null, тогда цари считаются равными. Равны ли цари тогда? Философвски как-то.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ага, в прошлом решении, если произойдёт ошибка, то по ней будет не понятно, что было причиной различия и придётся дебажить каждый упавший тест отдельно - это муторно.
Второй пункт не совсем понял, мы всегда ожидаем какого-то царя. Если ожидаем null
, вероятно так необходимо. Например, если в базе данных мы не ожидаем увидеть такого-то царя, то он может быть null
;)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Про второй пункт, мне это просто кажется логически неверно - нам пришли вообще не цари, оба null. Тогда тест вернёт true. Не цари равны.
Наверное я тут больше копаю в ту сторону, что до AreEqual не должно вообще доходить null, это должно отлавливаться заранее.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Про второй пункт, мне это просто кажется логически неверно - нам пришли вообще не цари, оба null. Тогда тест вернёт true. Не цари равны.
Но ведь в тестах у нас есть два значения:
- actual - значение, которое мы получили из базы данных/внешнего API/метода
- expected - константа в тесте, которую ожидалась увидеть.
В этом плане не понятно, что такое "пришли не цари". Так как один параметр контролируется тестом.
Если имелось ввиду, что вместо царя со значением null
пришла королева со значением null
, то это не допускается статической типизацией языка :)
А также вопрос, разве сейчас два null
сравниваются по-другому через Fluent Assertions?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, что-то я действительно тут переусложнил - мне это свойственно!
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Outdated
Show resolved
Hide resolved
…ия ExcludeRecursively<TDeclaringType, TPropertyType>.
… функциональность.
…ero теперь корректно передаёт аргумент precision.
…sult" в атрибуте [TestCase].
…а IsValidNumber_InvolvesSignInLengthCalculation.
@Folleach