Picking up where we left off, I want to add unit tests to my program. Now, I know, I should have been using unit tests all along. I have no excuse and hang my head in shame.
To get started, I’ve decided to add xUnit through NuGet. Easy peasy. But it won’t work. The full explanation is here. Great article. Here, in a nutshell are the steps you need to perform:
- Create an xUnit test project in the same solution as ForgetMeNot
- Make sure it runs
- Add a reference to the ForgetMeNot project
- This wil not run yet. Here is where the fun begins
- First, open up the ForgetMeNot project and change the TargetFrameworks to
<TargetFrameworks>net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
6. Replace the output statement with
<OutputType Condition="'$(TargetFramework)' != 'net6.0'">Exe</OutputType>
7. Unload ForgetMeNot, reload it, close Visual Studio, open Visual Studio and voila! it will work
(The whys and wherefores are explained very well in the article referenced above)
NSubstitute for mocking
We are now almost ready to begin. I want to use mocking from the very beginning. Until about a weak ago, I’d have installed Moq, but I’m intrigued by NSubstitute, so I’m going to use that.
After assuring myself that the default xUnit test works, I’ll add a file called BuddyTests. In there I will add my first test: ShouldPopulateBuddies. I want to make sure that calling Init() will populate the list of buddies (actually, it could return no buddies, but right now I just want to get this test working).
[Fact]
public async Task ShouldPopulateBuddies()
{
var buddies = new List<Buddy>();
var buddy = new Buddy();
buddies.Add(buddy);
var buddyService = Substitute.For<IBuddyService>();
buddyService.GetBuddies().Returns(buddies);
var buddyListVM = new BuddyListViewModel(buddyService);
await buddyListVM.Init();
Assert.True( buddyListVM.Buddies?.Count > 0);
}
So what is going on here? First I create an empty list of Buddy objects and I create an instance of Buddy which I add to that list.
Next (and here is the cool part) I create a mock for my service with that one line
var buddyService = Substitute.For<IBuddyService>();
Remember that Substitute wants interfaces, so earlier I went to each class in my services, put the cursor on the class name and used Refactor->Extract->ExtractInterface which brought up this wonderful dialog box:

I clicked on Select Public to get the public methods and Its own file to put the new interface in a file named IBuddyService.cs. R# is even nice enough to tack the interface name onto the class declaration.
OK, enough digression. My next step is to tell the mock that when the BuddyService’s GetBuddies method is returned, it should return the list of Buddies we just created.
We are now ready to create an instance of the ViewModel and call init() on it. It will use the service we passed in (the mock) and will thus populate its list of buddies with our dummy list and the Assert will pass.
Cool, eh?
This also tells me that I need to handle the case when the list is empty. That means I need to look long and hard at Init() and possibly add another test to prove that the corner case does not cause a problem.
Wrapping Up
It turns out that simple unit tests with mocking is not all that hard to do; and nSubstitute has a lot less ceremony than Moq. I’m going to stay with it for a while and see if I run off a cliff.
Since all the source code changes are already in this blog post, I won’t update the online source until I’ve written some more tests.
Shout-out to Daniel Hindrikes for helping me get started on unit testing for MAUI
See next posting for more unit testing using Fluent asserts.
À la recherche de divertissements interactifs? Ce site propose des centaines de titres adaptés à chaque passionné.
Des puzzles en passant par les jeux de stratégie, plongez des mécaniques innovantes sans téléchargement .
Découvrez les nouveautés comme le Takuzu ou des aventures dynamiques en solo .
Les amateurs de sport, des courses automobiles en 3D réaliste vous attendent.
roulette gratuit en ligne
Accédez gratuitement d’expériences premium et connectez-vous des joueurs passionnés.
Quel que soit l’action, cette bibliothèque virtuelle s’impose comme une référence incontournable.
À la recherche de divertissements interactifs? Ce site propose des centaines de titres pour tous les goûts .
Des puzzles en passant par les jeux de stratégie, explorez des mécaniques innovantes sans téléchargement .
Testez les classiques comme le Takuzu ou des simulations immersives en équipe.
Les amateurs de sport, des courses automobiles en mode battle royale vous attendent.
https://qualiteonline.com/roulette.html
Profitez d’expériences premium et connectez-vous une communauté active .
Que vous préfériez l’action, ce site deviendra une référence incontournable.
Прямо здесь можно получить Telegram-бот “Глаз Бога”, который найти данные по человеку из открытых источников.
Инструмент активно ищет по фото, обрабатывая доступные данные в сети. Благодаря ему можно получить пять пробивов и детальный анализ по запросу.
Сервис обновлен на август 2024 и включает мультимедийные данные. Бот гарантирует найти профили в открытых базах и покажет сведения за секунды.
глаз бога
Это сервис — выбор в анализе граждан через Telegram.
Прямо здесь вы найдете мессенджер-бот “Глаз Бога”, что найти всю информацию о человеке из открытых источников.
Инструмент работает по фото, обрабатывая актуальные базы в сети. Через бота можно получить пять пробивов и детальный анализ по фото.
Сервис проверен на 2025 год и поддерживает аудио-материалы. Сервис сможет узнать данные по госреестрам и предоставит результаты в режиме реального времени.
глаз бога информация
Такой сервис — выбор для проверки людей онлайн.
На данном сайте доступен мессенджер-бот “Глаз Бога”, позволяющий проверить сведения о человеке по публичным данным.
Инструмент работает по фото, обрабатывая актуальные базы в сети. Через бота можно получить 5 бесплатных проверок и детальный анализ по запросу.
Платфор ма обновлен на август 2024 и охватывает мультимедийные данные. Бот гарантирует узнать данные по госреестрам и отобразит результаты мгновенно.
программа глаз бога для поиска людей
Такой инструмент — идеальное решение при поиске людей онлайн.
На данном сайте вы найдете сервис “Глаз Бога”, что собрать сведения о человеке по публичным данным.
Сервис работает по номеру телефона, используя публичные материалы онлайн. Через бота осуществляется пять пробивов и полный отчет по запросу.
Сервис проверен согласно последним данным и охватывает аудио-материалы. Сервис поможет найти профили в открытых базах и покажет результаты за секунды.
глаз бога
Такой сервис — идеальное решение при поиске персон онлайн.
Размещение оборудования для наблюдения позволит защиту помещения в режиме 24/7.
Современные технологии позволяют организовать четкую картинку даже в ночных условиях.
Мы предлагаем широкий выбор систем, адаптированных для бизнеса и частных объектов.
стоимость установки видеонаблюдения
Качественный монтаж и сервисное обслуживание превращают решение простым и надежным для каждого клиента.
Обратитесь сегодня, для получения лучшее решение для установки видеонаблюдения.
Размещение систем видеонаблюдения позволит контроль помещения в режиме 24/7.
Современные технологии гарантируют высокое качество изображения даже в темное время суток.
Мы предлагаем различные варианты устройств, идеальных для офиса.
videonablyudeniemoskva.ru
Грамотная настройка и консультации специалистов обеспечивают простым и надежным для каждого клиента.
Оставьте заявку, чтобы получить персональную консультацию по внедрению систем.
Коллекция Nautilus, созданная мастером дизайна Жеральдом Гентой, сочетает элегантность и прекрасное ремесленничество. Модель Nautilus 5711 с автоматическим калибром 324 SC имеет энергонезависимость до 2 дней и корпус из нержавеющей стали.
Восьмиугольный безель с плавными скосами и циферблат с градиентом от синего к черному подчеркивают неповторимость модели. Браслет с интегрированными звеньями обеспечивает комфорт даже при активном образе жизни.
Часы оснащены функцией даты в позиции 3 часа и сапфировым стеклом.
Для версий с усложнениями доступны хронограф, лунофаза и функция Travel Time.
patek-philippe-nautilus.ru
Например, модель 5712/1R-001 из розового золота с механизмом на 265 деталей и запасом хода до 48 часов.
Nautilus остается символом статуса, объединяя инновации и классические принципы.
Эта платформа размещает интересные инфосообщения со всего мира.
Здесь можно найти факты и мнения, науке и многом другом.
Материалы выходят почти без перерывов, что позволяет не пропустить важное.
Простой интерфейс делает использование комфортным.
https://centre-beauty.ru
Любой материал проходят проверку.
Целью сайта является информативности.
Читайте нас регулярно, чтобы быть в курсе самых главных событий.
Premium mechanical timepieces continue to captivate for many compelling factors.
Their engineering excellence and history make them unique.
They symbolize status and success while combining utility and beauty.
Unlike digital gadgets, they appreciate with age due to exclusive materials.
https://zekond.com/read-blog/62911
Collectors and enthusiasts treasure the engineering marvels that no battery-powered watch can replace.
For many, collecting them defines passion that remains eternal.
Die Royal Oak 16202ST vereint ein rostfreies Stahlgehäuse in 39 mm mit einem nur 8,1 mm dünnen Bauweise und dem automatischen Werk 7121 für 55 Stunden Gangreserve.
Das blaue Petite-Tapisserie-Dial mit leuchtenden Stundenmarkern und Royal-Oak-Zeigern wird durch eine Saphirglas-Scheibe mit blendschutzbeschichteter Oberfläche geschützt.
Neben praktischer Datumsanzeige bietet die Uhr bis 5 ATM geschützte Konstruktion und ein geschlossenes Edelstahlband mit Faltschließe.
15450st royal oak
Die oktogonale Lünette mit verschraubten Edelstahlteilen und die gebürstete Oberflächenkombination zitieren den legendären Genta-Entwurf.
Als Teil der „Jumbo“-Linie ist die 16202ST eine horlogerie-Perle mit einem Preis ab ~75.900 €.
Стальные резервуары используются для сбора нефтепродуктов и соответствуют стандартам температур до -40°C.
Вертикальные емкости изготавливают из нержавеющих сплавов с антикоррозийным покрытием.
Идеальны для АЗС: хранят бензин, керосин, мазут или биодизель.
Емкость подземная ЕП 40 м3
Двустенные резервуары обеспечивают экологическую безопасность, а подземные модификации подходят для разных условий.
Заводы предлагают индивидуальные проекты объемом до 500 м³ с технической поддержкой.
Die Royal Oak 16202ST kombiniert ein 39-mm-Edelstahlgehäuse mit einem ultradünnen Design von nur 8,1 mm Dicke.
Ihr Herzstück bildet das neue Kaliber 7121 mit erweitertem Energievorrat.
Der blaue „Bleu Nuit“-Ton des Zifferblatts wird durch das Petite-Tapisserie-Muster und die kratzfeste Saphirscheibe mit blendschutzbeschichteter Oberfläche betont.
Neben klassischer Zeitmessung bietet die Uhr ein praktisches Datum bei Position 3.
Piguet Audemars Royal Oak 14790st armbanduhr
Die bis 5 ATM geschützte Konstruktion macht sie alltagstauglich.
Das geschlossene Stahlband mit faltsicherer Verschluss und die oktogonale Lünette zitieren das ikonische Royal-Oak-Erbe aus den 1970er Jahren.
Als Teil der „Jumbo“-Kollektion verkörpert die 16202ST horlogerie-Tradition mit einem aktuellen Preis ab ~75.900 €.
Die Royal Oak 16202ST kombiniert ein rostfreies Stahlgehäuse von 39 mm mit einem ultradünnen Design von nur 8,1 mm Dicke.
Ihr Herzstück bildet das neue Kaliber 7121 mit 55 Stunden Gangreserve.
Der smaragdene Farbverlauf des Zifferblatts wird durch das feine Guillochierungen und die kratzfeste Saphirscheibe mit Antireflexbeschichtung betont.
Neben klassischer Zeitmessung bietet die Uhr ein Datumsfenster bei 3 Uhr.
royal oak 15202
Die 50-Meter-Wasserdichte macht sie alltagstauglich.
Das integrierte Edelstahlarmband mit verstellbarem Dornschließe und die achtseitige Rahmenform zitieren das ikonische Royal-Oak-Erbe aus den 1970er Jahren.
Als Teil der legendären Extra-Thin-Reihe verkörpert die 16202ST horlogerie-Tradition mit einem Wertanlage für Sammler.