UnitTest和PostSharp工具包,域和线程

时间:2013-10-15 17:25:08

标签: c# nunit postsharp

我正在尝试对使用NotifyPropertyChanged和DispatchMethod修饰的模型进行单元测试。

BaseModel

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

public abstract class BaseModel : INotifyPropertyChanged, IDisposable
{
    #region Fields

    private readonly HashSet<string> ignorablePropertyNameses = new HashSet<string>();

    private bool isDirty;

    #endregion

    #region Constructors and Destructors

    protected BaseModel() { this._propertyChanged += this.OnAnyPropertyChanged; }

    #endregion

    #region Public Events

    public event PropertyChangedEventHandler PropertyChanged
    {
        add { this._propertyChanged += value; }
        remove { this._propertyChanged -= value; }
    }

    #endregion

    #region Events

    private event PropertyChangedEventHandler _propertyChanged;

    #endregion

    #region Public Properties

    public HashSet<string> IgnorablePropertyNames
    {
        get { return this.ignorablePropertyNameses; }
    }

    public bool IsDirty
    {
        get { return this.isDirty; }
    }

    #endregion

    #region Public Methods and Operators

    public void Dispose() { this._propertyChanged -= this.OnAnyPropertyChanged; }

    public void RaisePropertyChanged(string propertyName)
    {
        if (null != this._propertyChanged)
        {
            this._propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public virtual void Save()
    {
        this.isDirty = false;
        MessageBox.Show("Changes have been saved");
    }

    public void SetClean() { this.isDirty = false; }

    #endregion

    #region Methods

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this._propertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private void OnAnyPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        if (!this.ignorablePropertyNameses.Contains(propertyChangedEventArgs.PropertyName))
        {
            this.isDirty = true;
        }
    }

    #endregion
}

DogModel

using System;
using System.Threading;

using AGP.WinForms.MVC.PassiveView;

using PostSharp.Toolkit.Domain;
using PostSharp.Toolkit.Threading;

[NotifyPropertyChanged]
public class DogModel : BaseModel
{
    #region Fields

    private Timer timer;

    #endregion

    #region Constructors and Destructors

    public DogModel()
    {
        this.IgnorablePropertyNames.Add("CurrentDateAndTime");
        this.timer = new Timer(state => this.BroadcastTime(), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
    }

    #endregion

    #region Public Properties

    public string Breed { get; set; }

    public DateTime CurrentDateAndTime { get; set; }
    public string Name { get; set; }

    #endregion

    #region Methods

    [DispatchedMethod]
    private void BroadcastTime() { this.CurrentDateAndTime = DateTime.Now; }

    #endregion
}

使用此测试:

using NUnit.Framework;

[TestFixture]
public class DogModelTests
{
    [Test]
    public void DirtyFlag()
    {
        var model = new DogModel();
        Assert.IsFalse(model.IsDirty);
    }

}

但是在测试执行时遇到以下错误:

System.InvalidOperationException:标记为DispatcherObjectAspect的类的实例只能在具有同步上下文的线程(通常是WPF或Windows.Forms UI线程)上创建,或者必须手动实现IDispatcherObject。

我如何提供所需的同步上下文?

1 个答案:

答案 0 :(得分:1)

显然我需要做的就是设置它......

    [SetUp]
    public void SetUp()
    {
        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
    }

案件结案。