Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试wpf(禁用消息框)_C#_Wpf_Unit Testing - Fatal编程技术网

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

C# 单元测试wpf(禁用消息框),c#,wpf,unit-testing,C#,Wpf,Unit Testing,我正在为我的代码编写单元测试。并使用“Microsoft.VisualStudio.TestTools”。 我不想在为包含消息框的函数运行“单元测试”时弹出消息。我可以通过使用以下代码来实现这一点 public static class UnitTestDetector { static UnitTestDetector() { string testAssemblyName = "Microsoft.VisualStudio.QualityTools.Unit

我正在为我的代码编写单元测试。并使用“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);
}
例如,通过构造函数将接口传递给您正在测试的类

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");     
}
在实际生产代码中,您将实现一个界面,该界面将显示消息并将其传递给viewmodel

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

创建用于显示消息的界面

public interface IDisplay
{
    void ShowMessage(string message);
}
例如,通过构造函数将接口传递给您正在测试的类

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");     
}
在实际生产代码中,您将实现一个界面,该界面将显示消息并将其传递给viewmodel

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