Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Messagebox and Unit testing

I'm trying to find the best way to uncouple messageboxes from my logic so I can properly unittest it. Now I was wondering if it would be enough if I just made a seperate helper class (C#) which I can stub later for my messagebox. For instance:

static class messageBoxHelper
{
    public static void msgBoxAlg(string message, string title, MessageBoxButtons   buttons, MessageBoxIcon icons, bool show)
    {
        if (show)
        {
            MessageBox.Show(message, title, buttons, icons);
        }
 }

Then everytime I'd need to use a messagebox i'd just use messageboxHelper/msgBoxAlg(...) instead of messagebox.show(...). Using the bool show I could enable or disable it during testing.

I'm just wondering if this is the "right way". By which I mean, is there an easier or better way to do this properly? I can't just ditch the messageboxes, they relay "vital" info to the user ("Do you want to close this windows?" YES/NO etc.). It could also just be I'm not using proper software engineering, and I should decouple my messageboxes from my bussinesslogic more?

like image 416
Enthusiastic Programmer Avatar asked Dec 19 '11 11:12

Enthusiastic Programmer


People also ask

Why unit testing is important?

The prime purpose of unit testing is to separate the written code for testing and determine if it works as intended. Unit testing involves testing individual components of a software program or application. The main objective of this process is to check that all the individual units are working in an intended way.

What is MessageBox show in C#?

Displays a message box in front of the specified object and with the specified text, caption, buttons, icon, and default button. Show(IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon) Displays a message box in front of the specified object and with the specified text, caption, buttons, and icon.

What is message box in Visual Studio?

The MsgBox function displays a message box and waits for the user to click a button and then an action is performed based on the button clicked by the user.


2 Answers

Yes, it is right way. But instead of static class, you should implement IDialogService and inject it into classes that should display dialogs:

public interface IDialogService
{
    void ShowMessageBox(...);

    ...
}

public class SomeClass
{
    private IDialogService dialogService;

    public SomeClass(IDialogService dialogService)
    {
       this.dialogService = dialogService;
    }

    public void SomeLogic()
    {
        ...
        if (ok)
        {
            this.dialogService.ShowMessageBox("SUCCESS", ...);
        }
        else
        {
            this.dialogService.ShowMessageBox("SHIT HAPPENS...", ...);
        }
    }
}

During testing the SomeClass you should inject mock object of the IDialogService instead of real one.

If you need to test more UI logic, consider to use MVVM pattern.

like image 169
Sergii Vashchyshchuk Avatar answered Sep 17 '22 12:09

Sergii Vashchyshchuk


Look into Inversion of Control (IoC), the basic principal is that things that perform actions ect should be passed in as an interface then you use a IoC container to bind interfaces to specific implementations for your app. To easily achieve this in your case pass the thing that does message boxes in as an interface and in your unit test creat a mock (fake) version of that message box service which does not show a message box

look at http://martinfowler.com/articles/injection.html for details on IoC, my favorite container is Ninject (http://ninject.org)

like image 37
Not loved Avatar answered Sep 20 '22 12:09

Not loved