c# - 单元测试 wpf(禁用消息框)

标签 c# wpf unit-testing

我正在为我的代码编写单元测试。并使用“Microsoft.VisualStudio.TestTools”。 我不想在为包含消息框的函数运行“单元测试”时弹出消息。我可以通过使用以下代码来做到这一点,

 public static class UnitTestDetector
{
    static UnitTestDetector()
    {
        string testAssemblyName = "Microsoft.VisualStudio.QualityTools.UnitTestFramework";
        UnitTestDetector.IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies()
            .Any(a => a.FullName.StartsWith(testAssemblyName));
    }

    public static bool IsInUnitTest { get; private set; }
}

但对于此解决方案,我必须在实际功能中使用“IsInUnitTest”来禁用消息框。还有其他解决办法吗?

最佳答案

是的。

创建显示消息的界面

public interface IDisplay
{
    void ShowMessage(string message);
}

例如通过构造函数将接口(interface)传递给您正在测试的类

public class ViewModel
{
    private readonly IDisplay _display;

    public ViewModel(IDisplay display)
    {
        _display = display;
    }

    public void DoSomething()
    {
        // do something
        _display.ShowMessage("result of do something");
    }
}

然后在测试中你将通过测试的实现

public class FakeDisplay : IDisplay
{
    public string LastDisplayedMessage => _lastDisplayedMessage;

    public void ShowMessage(string message)
    {
        _lastDisplayedMessage = message;
    }
}

[Test]
public void WhenDoSomething_ShouldShowMessage()
{
    var fakeDisplay = new FakeDisplay();
    var viewmodel = new ViewModel(fakeDisplay);

    viewmodel.DoSomething();

    fakeDisplay.LastDisplayedMessage.Should().Be("result of do something");     
}

在实际生产代码中,您将实现显示消息并将其传递给 View 模型的接口(interface)。

public class Display : IDisplay
{         
    public void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
}   

关于c# - 单元测试 wpf(禁用消息框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49789228/

相关文章:

c# - 如何访问另一个程序集中的类以进行单元测试?

c# - 如何从 Roslyn 的 `BaseList` 中的接口(interface)中区分类?

c# - 使用生成的决策树来预测新的输入

c# - 如何在一个操作结果中返回两个 pdf 文件?

wpf - Application.Dispatcher.UnhandledException 和 CurrentDomain.UnhandledException

unit-testing - Angular2(TypeScript)中的单元测试/模拟窗口属性

C# 属性限制

wpf - 继续 WPF gridview 改动

wpf - 数据触发器中的标记扩展

javascript - 有效地对操纵 DOM 的 AngularJS 指令进行单元测试