c# - 使用 XUnit 测试动态扩展

标签 c# unit-testing dynamic caliburn.micro xunit.net

因此,我尝试测试调用注入(inject)对话框 API 的方法(使用 CaliburnMicro MVVM 框架)。

方法

public bool? ShowDialog(Screen dialog)
{
    dynamic settings = new ExpandoObject();
    settings.WindowStartupLocation = WindowStartupLocation.CenterOwner;
    settings.ResizeMode = ResizeMode.NoResize;
    return _dialogAPI.ShowDialog(dialog, null, settings);
}

这就是我尝试测试它的方式:

测试

[Fact]
public void DialogServiceCallAPIToShowDialog()
{
    var dialogAPI = new Mock<IWindowManager>();
    dialogAPI.Setup(x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<string, object>>())).Returns(() => true);

    var instance = new DialogService(dialogAPI.Object);
    instance.ShowDialog(It.IsAny<Screen>());

    dialogAPI.Verify(x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<string, object>>()), Times.Once, "Fail...");
}

问题

XUnit 未能告诉我这一点:

Message: Moq.MockException : "Fail..." Expected invocation on the mock once, but was 0 times: x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<String, Object>>())

Configured setups: x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<String, Object>>())

Performed invocations: IWindowManager.ShowDialog(null, null, [[WindowStartupLocation, CenterOwner], [ResizeMode, NoResize]])

我想这与我传递给 Is.Any 的数据类型有关。方法,但我不确定。有什么想法吗?

最佳答案

我认为你需要更换:

It.IsAny<Dictionary<string, object>>()

It.IsAny<IDictionary<string, object>>()

验证调用中。因为您传入 ShowDialogExpandoObject 实现了 IDictionary,但不是 Dictionary

这是我测试过的代码:

public class Screen {

}

public interface IWindowManager {
    bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null);
}

public class DialogService {
    private IWindowManager _dialogAPI;
    public DialogService(IWindowManager dialogAPI) {
        _dialogAPI = dialogAPI;
    }
    public virtual bool? ShowDialog(Screen dialog)
    {
        dynamic settings = new ExpandoObject();
        settings.WindowStartupLocation = WindowStartupLocation.CenterOwner;
        settings.ResizeMode = ResizeMode.NoResize;
        return _dialogAPI.ShowDialog(dialog, null, settings);
    }
}

您的代码失败,而用 IDictionary 替换 Dictionary 则正常:

var dialogAPI = new Mock<IWindowManager>();
dialogAPI.Setup(x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<string, object>>())).Returns(() => true);

var instance = new DialogService(dialogAPI.Object);
instance.ShowDialog(It.IsAny<Screen>());

dialogAPI.Verify(x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<IDictionary<string, object>>()), Times.Once, "Fail...");

关于c# - 使用 XUnit 测试动态扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49756823/

相关文章:

c# - 这个语法有什么作用?如果(obj 是 SomeType obj2)

PhpUnit 测试响应代码

apache-flex - 动态更改 FLEX 中 Datagrid 列的宽度

jquery - 将src文件动态插入音频标签,并将src名称存储在html代码中

linux - 如何在已编译的应用程序中替换 main()?

c# - 将 AppServiceAuthentication 与 signalR 结合使用

C# SqlConnection 异常 : Keyword not Supported 'Port'

c# - 反序列化 XML 时无法识别指定的类型错误

javascript - 从多个构造函数调用中通用读取参数

javascript - 使用 setTimeout 测试 IIFE