c# - 如何在 MSpec 中的每次测试运行之前运行代码?

标签 c# .net mspec

我正在尝试在测试前运行一些初始化代码。我试过 suggestions in other questions ,但它似乎不起作用。我的域模型通过以下类引发事件:

public static class DomainEvents
{
    private static readonly object @lock = new object();
    private static Action<IDomainEvent> raiseEvent;

    public static void Raise<TEvent>(TEvent @event) where TEvent : class, IDomainEvent 
    {
         // omitted for brevity
    }

    public static void RegisterEventPublisher(Action<IDomainEvent> eventPublisher)
    {
        lock (@lock)
        {
            raiseEvent = eventPublisher;
        }
    }
}

出于测试目的,我想在静态列表中捕获这些事件。这样做的最佳方法是什么?

更新

问题是由测试运行的顺序引起的(正如亚历山大在下面指出的那样,不能保证)。在我的一个规范中,我注册了一个模拟事件发布者。事实上,规范经常以不同的顺序运行意味着 a) 一开始我不知道我遇到了问题(“问题”规范总是最后运行)和 b)一旦我开始遇到问题,数量失败的测试通常会因运行而异(使其更加困惑)。

吸取的教训 - 在每个上下文运行后清理所有静态资源。您可以通过实现 ICleanupAfterEveryContextInAssembly 来做到这一点。

最佳答案

也许我误解了这个问题,但基本模式是:

public class WhenSomeDomainEventIsRaised
{
    private IList<IDomainEvent> EventsRaised = new List<IDomainEvent>();

    Establish context = () => 
    {
        // subscribe to events; when raised, add to EventsRaised list
    }
}

如果您想对所有测试或部分测试执行此操作:

public abstract class DomainSpecification
{
    protected IList<IDomainEvent> EventsRaised = new List<IDomainEvent>();

    Establish context = () => 
    {
        // subscribe to events; when raised, add to EventsRaised list
    }
}

您可以让所有需要此行为的规范都继承自此类,MSpec 将负责沿继承层次结构运行所有 Establish block 。

关于c# - 如何在 MSpec 中的每次测试运行之前运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217196/

相关文章:

c# - 如何对齐 TreeView wpf 中的值

C# CS0019 IntPtr

c# - Silverlight 中的三态按钮

c# - FormClosing属性有问题

c# - 部署套件建议

c# - 使用 SharpSVN api 是否有任何方法可用于在不导出文件的情况下获取修订版文件中包含的行数?

unit-testing - 既然我已经将所有单元测试迁移到 MSpec,我还需要 NUnit 吗?

asp.net-mvc - 即使在有效的 ViewResults 上,Machine.Specifications.MVC ShouldBeAView() 也总是失败

.net - 有没有一种方法可以在不继承NUnit的情况下在测试类之间共享断言?

c# - 如何在 Worker Role 托管的 Web API 中获取客户端服务器的唯一标识符