代码之家  ›  专栏  ›  技术社区  ›  Erre Efe

使用XUnit测试动态expando

  •  2
  • Erre Efe  · 技术社区  · 7 年前

    因此,我试图测试一个调用注入对话框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没有告诉我:

    信息:Moq。MockException:“失败…”应在模拟上调用 一次,但为0次: x => x.ShowDialog(It.IsAny<Screen>(), null, It.IsAny<Dictionary<String, Object>>())

    配置的设置: x=>x、 ShowDialog(It.IsAny<Screen>(),null, 信息技术IsAny<词典(<字符串,对象(>)&燃气轮机;())

    执行的调用:IWindowManager。ShowDialog(null,null, [[WindowsStartupLocation,CenterOwner],[ResizeMode,NoResize]])

    我想这与我传递给 Is.Any 方法,但我不确定。有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Evk    7 年前

    我认为您需要更换:

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

    具有

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

    在里面 Verify 呼叫因为 ExpandoObject 你路过这里 ShowDialog 机具 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);
        }
    }
    

    您的代码在替换时失败 词典 具有 I词典 通过罚款:

    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...");