\u003C/p>\u003Cp>YouTube: https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5 \u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Обсуждайте: \u003C/p>\u003Cul>\u003Cli>Telegram: https://t.me/dotnetmore_chat \u003C/li>\u003C/ul>\u003Cp>\u003Cbr />\u003C/p>Следите за новостями: \u003Cp>\u003C/p>\u003Cp>\u003C/p>\u003Cul>\u003Cli>Twitter: https://twitter.com/dotnetmore \u003C/li>\u003Cli>Telegram channel: https://t.me/dotnetmore\u003C/li>\u003C/ul>\u003Cp>\u003C/p>","episodic","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb.jpg",{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},"storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb_80.jpg","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb_180.jpg","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb_240.jpg","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb_600.jpg","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/images/d9ba6d52-dcbf-4be5-a368-584e0825a4fb_1280.jpg","https://cloud.mave.digital/37459",false,165,5,{"rate":23,"count":24},4.8,24,[26],{"name":27,"is_main":28},"Технологии",true,[30,31,32,21],2,3,4,"Написать мне","podcast.pro.dotnet@gmail.com",{"facebook":36,"twitter":37,"instagram":36,"telegram":38,"vk":39,"patreon":36,"boosty":36},null,"https://twitter.com/DotnetMore","https://t.me/dotnetmore","https://vk.com/dotnetmore",{"apple_id":41,"apple":42,"google":43,"spotify":44,"yandex":45,"vk":36,"castbox":46,"soundstream":36,"deezer":36,"overcast":47,"podcastAddict":48,"pocketCasts":49,"youtube":50,"soundcloud":36,"zvuk":36,"youtubeMusic":36,"myBook":36,"litres":36},1448111173,"https://podcasts.apple.com/us/podcast/dotnet-more/id1448111173?uo=4","https://podcasts.google.com/feed/aHR0cHM6Ly9hbmNob3IuZm0vcy8yYWYwNGEyYy9wb2RjYXN0L3Jzcw==","https://open.spotify.com/show/3OPA5bvULdzu7OJm8yPAz6","https://music.yandex.com/album/18268100","https://castbox.fm/vic/1448111173","https://overcast.fm/itunes1448111173","https://podcastaddict.com/podcast/3045190","https://pca.st/itunes/1448111173","https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5",[],{"id":53,"number":54,"season":21,"title":55,"description":56,"type":57,"image":11,"audio":58,"duration":59,"is_explicit":19,"code":60,"publish_date":61,"listenings":62,"is_transcription_hidden":19,"text":36,"is_private":19,"plans":36,"video":36,"images":63,"reactions":64,"chapters":70,"relevantEpisodes":71},"ef29b818-d0c9-4a7d-9794-5cfad46a4024",121,"DotNet&More #120: Говнокод - понятие относительное и не только","\"Вы написал говнокод, сэр\" - многие из нас боятся это услышать. Но что такое говнокод? Можно ли \"дружить с говнокодом\"? Что делать, если Вы поняли, что пишете говнокод? \u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:03:00 Легаси = Говнокод?\u003C/p>\u003Cp>00:08:10 Что такое \"Читаемость кода\"?\u003C/p>\u003Cp>00:16:00 Говнокод - код, сложный в поддержке\u003C/p>\u003Cp>00:22:40 Общий знаменатель стиля кода\u003C/p>\u003Cp>00:31:40 Overengineering\u003C/p>\u003Cp>00:36:40 MediatR провоцирует говнокод?\u003C/p>\u003Cp>00:39:00 Пишут ли шахматисты говнокод?\u003C/p>\u003Cp>00:49:20 Есть ли \"непростительный\" говнокод?\u003C/p>\u003Cp>00:58:00 Как дружить с говнокодом?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://shitcode.net/\">https://shitcode.net/\u003C/a> : Говнокод\u003C/p>\u003Cp>- \u003Ca href=\"https://govnokod.xyz/\">https://govnokod.xyz/\u003C/a> : Говнокод на русском\u003C/p>\u003Cp>- \u003Ca href=\"https://www.reddit.com/r/shittyprogramming/\">https://www.reddit.com/r/shittyprogramming/\u003C/a> : Reddit про говнокод... но кода там не так много :(\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/e028yvnFvvk\">https://youtube.com/live/e028yvnFvvk\u003C/a>\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","full","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/ef29b818-d0c9-4a7d-9794-5cfad46a4024.mp3",4435,123,"2024-06-14T07:20:52.484Z",398,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},[65,68],{"type":66,"count":67},"like","0",{"type":69,"count":67},"dislike",[],[72,83,93,103,113,123,132,142,152],{"id":73,"number":74,"season":21,"title":75,"description":76,"type":57,"image":11,"audio":77,"duration":78,"is_explicit":19,"code":79,"publish_date":80,"listenings":81,"is_private":19,"plans":36,"video":36,"images":82},"2cbfbf0d-3666-40e4-8399-00db6937a656",120,"DotNet&More #120: Интеграционные тесты и не только","Что такое интеграционные тесты? Как их писать? Можно ли перевернуть тестовую пирамиду?\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:05:10 Что такое интеграционный тест?\u003C/p>\u003Cp>00:15:40 А что если только интеграционные тесты?\u003C/p>\u003Cp>00:20:30 Как работают интеграционные тесты в Rider/Resharper?\u003C/p>\u003Cp>00:33:40 Интеграционные тесты для бекенда\u003C/p>\u003Cp>00:52:45 Тестовые контейнеры\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests\">https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests\u003C/a> : Integration tests in ASP.NET Core\u003C/p>\u003Cp>- \u003Ca href=\"https://docs.docker.com/language/dotnet/run-tests/\">https://docs.docker.com/language/dotnet/run-tests/\u003C/a> : Run .NET tests in a container\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/SV1FbOvWqas\">https://youtube.com/live/SV1FbOvWqas\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/2cbfbf0d-3666-40e4-8399-00db6937a656.mp3",3823,122,"2024-06-07T10:38:00.000Z",375,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":84,"number":85,"season":21,"title":86,"description":87,"type":57,"image":11,"audio":88,"duration":89,"is_explicit":19,"code":54,"publish_date":90,"listenings":91,"is_private":19,"plans":36,"video":36,"images":92},"45369d54-b328-42e2-962d-be75a020274f",119,"DotNet&More #119: TDD это не то что Вы думаете и не только","TDD - это не про тесты! TDD - это не \"правильно и обязательно\"! TDD - это ... узнаете в новом выпуске :) \u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:07:00 Что такое TDD?\u003C/p>\u003Cp>00:15:40 Test Frist или TDD\u003C/p>\u003Cp>00:34:00 TDD на легаси\u003C/p>\u003Cp>00:45:55 Чем TDD плох? \u003C/p>\u003Cp>00:49:00 TDD и состояние потока\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://youtu.be/TmY3AuoW_PU\">https://youtu.be/TmY3AuoW_PU\u003C/a> : Test Last, Test First, TDD: когда применять тот или иной подход \u003C/p>\u003Cp>- \u003Ca href=\"https://www.youtube.com/playlist?list=PLOGzxujsqdGDpW8mHsQwBByVYR2-9GX7u\">https://www.youtube.com/playlist?list=PLOGzxujsqdGDpW8mHsQwBByVYR2-9GX7u\u003C/a> : Is TDD Dead? Мегахоливар \u003C/p>\u003Cp>- \u003Ca href=\"https://www.ozon.ru/product/ekstremalnoe-programmirovanie-razrabotka-cherez-testirovanie-bek-kent-211432674\">https://www.ozon.ru/product/ekstremalnoe-programmirovanie-razrabotka-cherez-testirovanie-bek-kent-211432674\u003C/a> : \"Библия\" TDD\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/MIQTO10iaGk\">https://youtube.com/live/MIQTO10iaGk\u003C/a>\u003C/p>\u003Cp>Аудио: \u003C/p>\u003Cp>Скачать: \u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/45369d54-b328-42e2-962d-be75a020274f.mp3",3646,"2024-05-31T09:38:30.217Z",360,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":94,"number":95,"season":21,"title":96,"description":97,"type":57,"image":11,"audio":98,"duration":99,"is_explicit":19,"code":74,"publish_date":100,"listenings":101,"is_private":19,"plans":36,"video":36,"images":102},"2f322de3-73db-430a-805d-e92fcd3a074b",118,"DotNet&More #118: Тесты в пет проектах","Писать тесты \"за деньги\" мы привыкли, но пет проекты же для души! Так есть ли смысл?\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:05:40 Зачем писать тесты на пет проекты?\u003C/p>\u003Cp>00:13:00 Тесты для gamedev\u003C/p>\u003Cp>00:18:00 Чем отличаются pet-project тесты от production тестов?\u003C/p>\u003Cp>00:21:30 Бюджет пет проекта\u003C/p>\u003Cp>00:29:20 Мотивация писать тесты\u003C/p>\u003Cp>00:39:10 Лайвхаки\u003C/p>\u003Cp>00:51:00 TDD в пет проектах\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/EAy_WqB00j4\">https://youtube.com/live/EAy_WqB00j4\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/2f322de3-73db-430a-805d-e92fcd3a074b.mp3",3944,"2024-05-24T09:32:00.000Z",368,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":104,"number":105,"season":21,"title":106,"description":107,"type":57,"image":11,"audio":108,"duration":109,"is_explicit":19,"code":85,"publish_date":110,"listenings":111,"is_private":19,"plans":36,"video":36,"images":112},"88e033a0-c257-479a-b707-ebcdc87720a7",117,"DotNet&More #117: Тестируем код без лишних интерфейсов и не только","В C# принято создавать отдельный интерфейс для каждой сущности ради обеспечения тестируемости. Но так ли это нужно? Можно ли обойтись без создания дублирующего кода?\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:02:50 В чем проблема интерфейсов для тестов?\u003C/p>\u003Cp>00:18:45 protected virtual метод вместо выноса интерфейса\u003C/p>\u003Cp>00:34:40 Мокаем прямые зависимости, AutoMock\u003C/p>\u003Cp>00:50:50 Производительность вызова виртуальных методов\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/moq/Moq.AutoMocker\">https://github.com/moq/Moq.AutoMocker\u003C/a> : Moq.AutoMocker\u003C/p>\u003Cp>- \u003Ca href=\"https://dev.to/aloneguid/c-net-method-call-performance-facts-1koi\">https://dev.to/aloneguid/c-net-method-call-performance-facts-1koi\u003C/a> : C#/.NET Method Call Performance - Facts\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/eBnaLdq0VXQ\">https://youtube.com/live/eBnaLdq0VXQ\u003C/a>\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/88e033a0-c257-479a-b707-ebcdc87720a7.mp3",3636,"2024-05-10T07:12:34.187Z",411,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":114,"number":115,"season":21,"title":116,"description":117,"type":57,"image":11,"audio":118,"duration":119,"is_explicit":19,"code":95,"publish_date":120,"listenings":121,"is_private":19,"plans":36,"video":36,"images":122},"553045f8-d395-4c68-a633-6f1dbc6cc5d9",116,"DotNet&More #116: Рефакторить тесты и код, или только тесты ... и не только","Вы решились отрефакторить тесты, но как? \u003Cp>- Следовать принципу \"Сложные тесты результат сложного кода\" и переделать код? \u003C/p>\u003Cp>- Неинвазивно поменять только тесты?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Что же выбрать?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:11:55 Сколько тестов надо писать?\u003C/p>\u003Cp>00:21:00 Меняем и тесты, и тестируемый код\u003C/p>\u003Cp>00:46:45 Рефакторим только тесты\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- https://github.com/dotnetmore/shit-tests : Проект с \"плохими\" тестам\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: https://youtube.com/live/j_eWBt8vLa4\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: https://dotnetmore.mave.digital\u003C/p>\u003Cp>YouTube: https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: https://t.me/dotnetmore_chat\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: https://twitter.com/dotnetmore\u003C/p>\u003Cp>– Telegram channel: https://t.me/dotnetmore\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: https://creativecommons.org/licenses/by-sa/4.0/\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/553045f8-d395-4c68-a633-6f1dbc6cc5d9.mp3",3825,"2024-04-27T07:48:59.792Z",406,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":124,"number":125,"season":21,"title":126,"description":127,"type":57,"image":11,"audio":128,"duration":129,"is_explicit":19,"code":105,"publish_date":130,"listenings":121,"is_private":19,"plans":36,"video":36,"images":131},"904069bc-944c-45b8-9594-cd794f1fa437",115,"DotNet&More #115: Рефакторим тесты, тестовые фреймворки и не только","\u003Cb>Присоединяйтесь к брейншторму \"как улучшить тесты\", добавляйте свой Pull Request в \u003Ca href=\"https://github.com/dotnetmore/shit-tests\">https://github.com/dotnetmore/shit-tests\u003C/a>\u003C/b>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Тесты должны быть понятные, говорили они. Тесты должны быть короткие, учили они. Но что делать, если только arrange занимает 20 строк? А если act - больше чем просто вызов метода? А если логика кода достаточно сложная, так что в однострочный assert не влезает?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:02:30 DRY в тестах\u003C/p>\u003Cp>00:13:15 Как рефакторить и код, и тесты одновременно\u003C/p>\u003Cp>00:20:30 А что если делать маленькие классы и маленькие тесты?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/dotnetmore/shit-tests\">https://github.com/dotnetmore/shit-tests\u003C/a> : Тесты, которые мы разбирали в выпуске\u003C/p>\u003Cp>- \u003Ca href=\"https://fluentassertions.com/introduction\">https://fluentassertions.com/introduction\u003C/a> : Fluent Assertions\u003C/p>\u003Cp>- \u003Ca href=\"https://nsubstitute.github.io/\">https://nsubstitute.github.io/\u003C/a> : NSubstitute \u003C/p>\u003Cp>- \u003Ca href=\"https://www.testrail.com/blog/5-bdd-tools-c-codebases/\">https://www.testrail.com/blog/5-bdd-tools-c-codebases/\u003C/a> : Обзор BDD фреймворков \u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/VerifyTests/Verify/\">https://github.com/VerifyTests/Verify/\u003C/a> : Verify для сложного assert\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/VerifyTests/Verify.Serilog\">https://github.com/VerifyTests/Verify.Serilog\u003C/a> : Verify для логов 0_o\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: https://youtube.com/live/dPH6W7yMJPw\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/904069bc-944c-45b8-9594-cd794f1fa437.mp3",4050,"2024-04-20T09:58:31.002Z",{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":133,"number":134,"season":21,"title":135,"description":136,"type":57,"image":11,"audio":137,"duration":138,"is_explicit":19,"code":115,"publish_date":139,"listenings":140,"is_private":19,"plans":36,"video":36,"images":141},"ba26e8d0-4755-4773-9d6c-15dad35adc2a",114,"DotNet&More #114: Как писать \"чистые\" тесты и не только","На читаемость тестов мало кто обращает внимание, а зря - тут много проблем и неочевидных решений.\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:04:00 Сферический тест в вакууме\u003C/p>\u003Cp>00:13:20 Какими кейсами жертвовать? \u003C/p>\u003Cp>00:15:00 Нейминг\u003C/p>\u003Cp>00:24:40 Вычисления в тесте\u003C/p>\u003Cp>00:30:00 Ссылка на тикет в тесте\u003C/p>\u003Cp>00:47:10 Ненужный Verify\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://dev.to/thawkin3/clean-code-with-unit-tests-tips-and-tricks-for-keeping-your-test-suites-clean-483l\">https://dev.to/thawkin3/clean-code-with-unit-tests-tips-and-tricks-for-keeping-your-test-suites-clean-483l\u003C/a> : Неплохая статья, но много капитанства\u003C/p>\u003Cp>- \u003Ca href=\"https://en.wikipedia.org/wiki/Behavior-driven_development\">https://en.wikipedia.org/wiki/Behavior-driven_development\u003C/a> : BDD\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/Ztfahr3_Mi0\">https://youtube.com/live/Ztfahr3_Mi0\u003C/a>\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Background music: \u003Ca href=\"http://freemusicarchive.org/music/Six_Umbrellas/Ad_Astra\">http://freemusicarchive.org/music/Six_Umbrellas/Ad_Astra\u003C/a>\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/ba26e8d0-4755-4773-9d6c-15dad35adc2a.mp3",3697,"2024-04-12T09:13:30.255Z",423,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":143,"number":144,"season":21,"title":145,"description":146,"type":57,"image":11,"audio":147,"duration":148,"is_explicit":19,"code":125,"publish_date":149,"listenings":150,"is_private":19,"plans":36,"video":36,"images":151},"d4e34845-6fa3-4940-9d95-92448cce7bf4",113,"DotNet&More #113: Тестирование тестов, code coverage, mutation testing и не только","Тесты мы написали, но что дальше? Как проверить что мы покрыли все возможные кейсы? А может некоторые тесты вообще бесполезны? Для этого есть несколько инструментов.\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:02:20 Критерии качества тестов\u003C/p>\u003Cp>00:13:00 Проверка функциональности тестов\u003C/p>\u003Cp>00:21:00 Line Code Coverage\u003C/p>\u003Cp>00:31:10 Branch Code Coverage \u003C/p>\u003Cp>00:47:30 ExcludeFromCodeCoverageAttribute, как правильно использовать\u003C/p>\u003Cp>00:55:40 Mutation Testing, \"работает\" ли в .Net?\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/coverlet-coverage/coverlet\">https://github.com/coverlet-coverage/coverlet\u003C/a> : Coverlet\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/danielpalme/ReportGenerator\">https://github.com/danielpalme/ReportGenerator\u003C/a> : Report Generator\u003C/p>\u003Cp>- \u003Ca href=\"https://stryker-mutator.io/\">https://stryker-mutator.io/\u003C/a> : Stryker Mutator\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/6EAzwRJMIg8\">https://youtube.com/live/6EAzwRJMIg8\u003C/a>\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Background music: http://freemusicarchive.org/music/Six_Umbrellas/Ad_Astra\u003C/p>\u003Cp>Copyright: https://creativecommons.org/licenses/by-sa/4.0/\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/d4e34845-6fa3-4940-9d95-92448cce7bf4.mp3",5411,"2024-03-22T13:25:48.980Z",547,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},{"id":153,"number":154,"season":21,"title":155,"description":156,"type":57,"image":11,"audio":157,"duration":158,"is_explicit":19,"code":134,"publish_date":159,"listenings":160,"is_private":19,"plans":36,"video":36,"images":161},"1294403d-29c8-4a89-a433-ee6d79de844f",112,"DotNet&More #112: Как заставить ChatGPT сгенерировать нормальные тесты и не только","В прошлом выпуске генерация тестов нас разочаровала, но нам потом объяснили: мы все делали не правильно. В этом раз исправляемся.\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Спасибо всем кто нас слушает. Ждем Ваши комментарии.\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Бесплатный открытый курс \"Rust для DotNet разработчиков\": \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3S2iE00WFPNTzKAARURZW1Z\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Shownotes: \u003C/p>\u003Cp>00:00:00 Вступление\u003C/p>\u003Cp>00:02:50 Как правильно состовлять промпт, советы эксперта\u003C/p>\u003Cp>00:25:20 Как создать свой GPT?\u003C/p>\u003Cp>00:29:00 Практика Copilot\u003C/p>\u003Cp>01:06:15 Практика AI Assitant\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Ссылки:\u003C/p>\u003Cp>- \u003Ca href=\"https://github.com/rodion-m/awesome_ai_for_programmers\">https://github.com/rodion-m/awesome_ai_for_programmers\u003C/a> : Awesome AI for Programmers \u003C/p>\u003Cp>- \u003Ca href=\"https://t.me/probelov_net\">https://t.me/probelov_net\u003C/a> : Канал Родиона про AI и не только\u003C/p>\u003Cp>- \u003Ca href=\"https://youtu.be/pm1V1FtQ33Y\">https://youtu.be/pm1V1FtQ33Y\u003C/a> : Доклад: Выжимаем максимум из ChatGPT для программистов\u003C/p>\u003Cp>- \u003Ca href=\"https://chat.openai.com/g/g-Yb0vNIKz6-c-code-test-master\">https://chat.openai.com/g/g-Yb0vNIKz6-c-code-test-master\u003C/a> : Сетап ChatGPT для генерации тестов\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Видео: \u003Ca href=\"https://youtube.com/live/l-ffyamBLBw\">https://youtube.com/live/l-ffyamBLBw\u003C/a>\u003C/p>\u003Cp>\t\u003C/p>\u003Cp>Слушайте все выпуски: \u003Ca href=\"https://dotnetmore.mave.digital\">https://dotnetmore.mave.digital\u003C/a>\u003C/p>\u003Cp>YouTube: \u003Ca href=\"https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\">https://www.youtube.com/playlist?list=PLbxr_aGL4q3R6kfpa7Q8biS11T56cNMf5\u003C/a>\u003C/p>\u003Cp>Обсуждайте:\u003C/p>\u003Cp>- Telegram: \u003Ca href=\"https://t.me/dotnetmore_chat\">https://t.me/dotnetmore_chat\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Следите за новостями:\u003C/p>\u003Cp>– Twitter: \u003Ca href=\"https://twitter.com/dotnetmore\">https://twitter.com/dotnetmore\u003C/a>\u003C/p>\u003Cp>– Telegram channel: \u003Ca href=\"https://t.me/dotnetmore\">https://t.me/dotnetmore\u003C/a>\u003C/p>\u003Cp>\u003Cbr />\u003C/p>\u003Cp>Background music: \u003Ca href=\"http://freemusicarchive.org/music/Six_Umbrellas/Ad_Astra\">http://freemusicarchive.org/music/Six_Umbrellas/Ad_Astra\u003C/a>\u003C/p>\u003Cp>Copyright: \u003Ca href=\"https://creativecommons.org/licenses/by-sa/4.0/\">https://creativecommons.org/licenses/by-sa/4.0/\u003C/a>\u003C/p>","storage/podcasts/79f85ce1-d4dc-4da6-b866-e7bb143f6450/episodes/1294403d-29c8-4a89-a433-ee6d79de844f.mp3",5147,"2024-03-15T09:47:57.662Z",483,{"image_80":13,"image_180":14,"image_240":15,"image_600":16,"image_1280":17},["Reactive",163],{"$ssite-config":164},{"_priority":165,"env":169,"name":170,"url":171},{"name":166,"env":167,"url":168},-10,-15,-4,"production","podcast-website","https://dotnetmore.mave.digital/",["Set"],["ShallowReactive",174],{"$63LOZx6kQb":-1},"/ep-123",{"common":177},{"activeTab":178,"isShareActive":19,"episodes":179,"contentPosition":19,"podcast":5,"podcastSlug":180,"showPlayer":19,"activeTrack":36,"pauseTrack":19,"activeEpisode":52,"titleHeight":181,"website":182,"listenUrl":36,"isMobileShareActive":19,"isDataLoaded":28,"favicon":183,"customDomain":36,"episodesCount":181},"listen",[],"dotnetmore",0,{"button_text":33,"button_link":34,"is_indexing":28,"ym_id":-1,"gtm_id":-1},""]