C#单元测试委托事件处理程序

艾伦·穆里根(Alan Mulligan)

我有一个CountDownTimer类,用于更新更新用户界面的控制器。我遇到的问题是,当我运行单元测试时,我得到了NllReferenceException,因为事件handlder(Tick)从未初始化为空。解决此问题的最佳方法是什么?还是我应该另辟different径。谢谢

public class CountDownTimer : ICountDownTimer
{
    private int seconds; // Time in seconds
    private int reSetValue; // Time in seconds
    private System.Windows.Forms.Timer timer1;
    public event TickHandler Tick;
    public EventArgs e = null;
    public delegate void TickHandler(CountDownTimer m, EventArgs e, int seconds);

    public CountDownTimer(int seconds)
    {
        this.seconds = seconds;
        reSetValue = seconds;

        timer1 = new System.Windows.Forms.Timer();
        timer1.Tick += new EventHandler(timer1_Tick); // Add Handler(timer1_Tick)
        timer1.Interval = 1000; // 1 second
     }

    private void timer1_Tick(object sender, EventArgs e)
    {
        CallTickHandler();

        if (getSeconds() == 0) // Stop Timer at 0
        {
            timer1.Stop(); // Stop timer
        }
        else
        {
            if (getSeconds() % 60 == 0 || getSeconds() >= 1 && getSeconds() <= 10)
            {
                CallTickHandler();
            }
        }
        seconds--; // Decrement seconds
    }

    public void StartTimer()
    {
        timer1.Start();
    }

    public void StopTimer()
    {
        timer1.Stop();
    }

    public void ResetTimer()
    {
        timer1.Stop();
        seconds = reSetValue;
        CallTickHandler();
    }

    public void SetTimer(int seconds)
    {
        timer1.Stop();
        this.seconds = getSeconds();
        reSetValue = getSeconds();
        CallTickHandler();
    }

    internal void CallTickHandler()
    {
        Tick(this, e, getSeconds());
    }

    public Boolean isEnabled()
    {
        return timer1.Enabled;
    }

    public int getSeconds()
    {
        return seconds;
    }
}


public class Controller : ApplicationContext
{
    //Store a reference to the UI
    internal frmMain MainUI { get; set; }
    private int seconds = 300;
    CountDownTimer timer;

    public Controller()
    {
        MainUI = new frmMain(this);

        //We can do any necessary checks or changes to the MainUI here before it becomes visible
        MainUI.Show();
        timer = new CountDownTimer(seconds);
        SubscribeToTickListener(timer);
        TickUpdate(seconds);
    }

    internal void TickUpdate(string seconds)
    {
        MainUI.lblTimer.Text = ("" + Convert.ToInt32(seconds) / 60).PadLeft(2, '0') + "m:" + ("" + Convert.ToInt32(seconds) % 60).PadLeft(2, '0') + "s";
    }

    internal void TickUpdate(int seconds)
    {
        MainUI.lblTimer.Text = ("" + seconds / 60).PadLeft(2, '0') + "m:" + ("" + seconds % 60).PadLeft(2, '0') + "s";
        if (seconds <= 10)
        {
            //ss.Speak(seconds.ToString());
        }
        else
        {
            //ss.Speak((seconds / 60).ToString() + " minute warning");
        }
    }

    internal void StartTimer()
    {
        timer.StartTimer();
    }

    internal void ResetTimer()
    {
        timer.ResetTimer();
    }

    internal void StopTimer()
    {
        timer.StopTimer();
    }

    internal void SetTimer(int seconds)
    {
        timer.SetTimer(seconds);
    }

    public void SubscribeToTickListener(CountDownTimer cdt)
    {
        cdt.Tick += new CountDownTimer.TickHandler(TickMsgRecieved);
    }
    public void TickMsgRecieved(CountDownTimer cdt, EventArgs e, int seconds)
    {
        TickUpdate(seconds);
        TickUpdate(seconds.ToString());
    }
}


public class CountDownTimerTests
{

    private CountDownTimer t = new CountDownTimer(300);

    [TestMethod()]
    public void CountDownTimerTest()
    {
        CountDownTimer t = new CountDownTimer(300);
    }

    [TestMethod()]
    public void StartTimerTest()
    {
        //CountDownTimer t = new CountDownTimer(300);
        t.StartTimer();
        Boolean expected = t.isEnabled();
        Boolean actual = true;
        Assert.AreEqual(expected, actual);
     }

    [TestMethod()]
    public void StopTimerTest()
    {
        //CountDownTimer t = new CountDownTimer(300);
        t.StartTimer();
        t.StopTimer();
        Boolean expected = t.isEnabled();
        Boolean actual = false;
        Assert.AreEqual(expected, actual);
    }

    [TestMethod()]
    public void ResetTimerTest()
    {
        int expected = t.getSeconds();
        t.ResetTimer();
        int actual = t.getSeconds();
        Assert.AreEqual(expected, actual);
    }

    [TestMethod()]
    public void SetTimerTest()
    {
        int expected = t.getSeconds();
        t.SetTimer(120);
        int actual = t.getSeconds();
        Assert.AreEqual(expected, actual);
    }
}
斯科特·莫肯

在这种情况下,您可能可以使用事件的模拟实现。我将以下模拟事件添加到您的测试类中,以模拟CountDownTimer类的使用者。

    [TestInitialize]
    public void TestSetup()
    {
        t.Tick += new CountDownTimer.TickHandler(MockTickEvent);
    }
    [TestCleanup]
    public void TestCleanup()
    {
        t.Tick -= MockTickEvent;
    }
    void MockTickEvent(CountDownTimer m, EventArgs e, int seconds)
    {
        ///you may need to add further test code here to fully cover your code
        return;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

丢失的jQuery委托事件处理程序

来自分类Dev

单元测试事件处理程序的代码

来自分类Dev

删除特定对象上的jQuery委托事件处理程序

来自分类Dev

MVVM:异步事件处理程序的单元测试

来自分类Dev

如何在C#中以CQRS模式对命令处理程序进行单元测试

来自分类Dev

如何使用委托事件,名称空间以及附加多个事件处理程序

来自分类Dev

如何使用xUnit对C#事件进行单元测试

来自分类Dev

C#中的单元测试形式和事件

来自分类Dev

jQuery $(document).prepend:委托事件处理程序中的“ TypeError:e为空”吗?

来自分类Dev

为什么悬停在委托事件处理程序中不起作用?

来自分类Dev

更改div内容后jQuery不响应-委托事件处理程序

来自分类Dev

单元测试golang处理程序

来自分类Dev

单元测试通用处理程序

来自分类Dev

JavaScript事件处理程序是否应该进行单元测试

来自分类Dev

如何在ViewModel中对OnPropertyChanged事件处理程序进行单元测试

来自分类Dev

jQuery-委托事件处理程序时,它还会自动从不再匹配的元素中自动删除吗?

来自分类Dev

.on()委托事件未触发

来自分类Dev

.on委托事件,无需点击

来自分类Dev

通用方法的c#单元测试

来自分类Dev

单元测试C#[TestInitialize]

来自分类Dev

C#单元测试列表

来自分类Dev

Windows窗体的C#单元测试

来自分类Dev

C#单元测试覆盖方法

来自分类Dev

随机失败的C#单元测试

来自分类Dev

连接的单元测试/ C#

来自分类Dev

void 方法的单元测试 C#

来自分类Dev

c#单元测试错误

来自分类Dev

覆盖单元测试 WebRequest c#

来自分类Dev

C#中的私有静态方法的单元测试接受其他私有静态方法作为委托参数

Related 相关文章

热门标签

归档