Quan Mai
Oct 24, 2014
(4 votes)

Mocking LocalizationService

There is a rule of thumb in EPiServer is any code written should be covered by tests, either unit tests or integration tests. While we’re not 100% test covered, but we are trying hard to. It’s a requirement to write tests whenever possible, and it’s generally accepted for the first comment of any review is “Can we write tests for this?”

While most of EPiServer API:s are fairly easy to mock and to test, LocalizationService is not the case. I fall in this trap today when trying to mock it by Moq. To this point, I realized that most of method in this class is not virtual, meaning it’s not mockable by Moq. Worse, it does not have a parameterless constructor, which eliminate the hope of using the virtual GetStringByCulture(string resourceKey, string fallback, CultureInfo culture) for mock.

I was disappointed. “No, we can’t have a untestable API:s like this. This is bad." Until I found that CMS core guys were cool enough to save the day!

Along with LocalizationService, we provide a class named MemoryLocalizationService, inherited from it. As it name suggested, instead of loading localized strings from disk, it works entirely in memory, which suits perfectly for unittest.

Then you can write a code like this:

    MemoryLocalizationService _localizationService = new MemoryLocalizationService();
    _localizationService.AddString(CultureInfo.CurrentUICulture, "<key>", "<value>");

And you now have a perfectly injectable LocalizationService instance for your unit test.

While I would prefer the normal approach as it's much more well-known, I appreciate CMS core team to make mocking LocalizationService possible. I don't know the reason, but they might introduce this cool hack to avoid introduce breaking changes to our code base.

Happy unit testing!

Oct 24, 2014


Please login to comment.
Latest blogs
Optimizely SendGrid SMTP host is deprecated

SendGrid is a services for sending email that is included in Optimizely DXP. Previously smtp.episerver.net was the recommended SMTP server to use,...

Tomas Hensrud Gulla | Dec 4, 2022 | Syndicated blog

Hosting Optimizely CMS 12 on Docker Engine

Since Optimizely CMS can now be deployed as a Docker container, here is a demonstration of building, running and scaling an Optimizely CMS 12 site ...

Stefan Holm Olsen | Dec 4, 2022 | Syndicated blog

How to use CacheTagHelper with content areas in Optimizely CMS 12

I might be going out on a limb here - if you have a better solution, feel very free to share it!  Upgrading your Optimizely web application from .N...

Andreas J | Dec 2, 2022

The 1001st Piece in your 1000 Piece Puzzle: .NET Default Interface Functions

I was recently working with a client who wanted a reasonably large subsystem added to Optimizely that would add automated management to their...

Greg J | Nov 28, 2022 | Syndicated blog

Video Demonstration, creating a CMS12 Alloy Sample Site

Hey All Below you will find a quick video demonstration on how to install a local version of Alloy Sample based on CMS12 / .Net 6. As you will see ...

Minesh Shah (Netcel) | Nov 28, 2022

Opticon Deep Dive: Optimizely's Product Announcements

We attended Opticon 2022 in San Diego which explored the future of orchestration, experimentation, and growth. We dive into Optimizely's product...

Liz Spranzani | Nov 28, 2022 | Syndicated blog