FakeItEasy:模拟 MessageBox

FakeItEasy: Mocking MessageBox

我需要避免(模拟)使用 FakeItEasy 框架对显示消息框的代码行进行单元测试。

代码在这里,

public class XYZ
{
    public static int nValue = 0;

    public void AddInetegers(int i)
    {

        int j = i * 100;
        int k = j * 30 / 100;

        MessageBox.Show("Value Here {0}",  k.ToString());

        nValue = k;
    }
}

MessageBox.Show是静态成员,cannot be faked by FakeItEasy。在这些情况下,访问 non-fakeable 服务的代码通常被隔离并包装在一个接口中。

以下是我的做法:

interface IAlerter
{
    void Alert(string text, string caption);
}

public class XYZ
{
    public static int nValue = 0;

    private readonly IAlerter _alerter;
    public XYZ(IAlerter alerter)
    {
        _alerter = alerter;
    }

    public void AddInetegers(int i)
    {

        int j = i * 100;
        int k = j * 30 / 100;

        _alerter.Show("Value Here {0}",  k.ToString());

        nValue = k;
    }
}

[TestMethod]
public void Test_Using_FakeItEasy()
{
    var alerter = A.Fake<IAlerter>();
    // No need to configure alerter.Alert(), since it doesn't return a value

    var xyz = new XYZ(alerter);
    xyz.AddInetegers(3);
    Assert.AreEqual(90, XYZ.nValue);
}