MEF Moq-cking 单元测试

MEF Moq-cking on Unit Testing

这是具有 Imported MEF 属性的 class

public class MyManager : IMyManager {
    [ImportMany]
    public ICollection<Lazy<IContext, IContextMetadata>> Contexts { get; set; }
    public IContext { get; set; }

    // Implemented from IMyManager interface
    public void DoStuff(string name) {
        this.Context = GetContext(name);
    }

    private IContext GetContext(string name) {
        return Contexts.Where(c => c.Metadata.Name.Equals(name)).Single().Value;
    }
}

我一直在关注 this answer 以尝试模拟和测试它,但我迷失在 actual/expected 值中,因为在我的情况下我需要断言 MyManager .Context 已更改。

我想我必须 Mock<IContext>() 并将其用于 Assert.Equals,但我如何模拟整个惰性列表?

我通常不会模拟 ICollection 或 IList 等,而只是使用实际的列表,对于 Lazy 也是如此。我不认为你通过模拟它得到任何东西,它最终会成为 LINQ 的艰苦工作。这是一个例子:

Mock<IContext> context = new Mock<IContext>();
Mock<IContextMetadata> contextMetadata = new Mock<IContextMetadata>();
// Do some setup here
ICollection<Lazy<IContext, IContextMetadata>> contexts = new List<Lazy<IContext, IContextMetadata>>();
Lazy<IContext, IContextMetadata> lazyContext = new Lazy<IContext, IContextMetadata>(() => context.Object, contextMetadata.Object);
contexts.Add(lazyContext)