代码之家  ›  专栏  ›  技术社区  ›  Darek

UnitTest和PostSharp工具包、域和线程

  •  2
  • Darek  · 技术社区  · 12 年前

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

    基本模型

    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
    }
    

    狗狗模型

    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 回复  |  直到 12 年前
        1
  •  2
  •   Darek    12 年前

    显然,我所需要做的就是设置它。。。

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

    案件已结案。