文档章节

隔离框架4-测试事件相关活动

z
 zhv
发布于 2017/05/25 00:04
字数 555
阅读 10
收藏 0

代码地址:http://git.oschina.net/zhv/UnitTest

测试事件相关活动

测试事件监听者

  • 检查监听对象是否对发生的事件做出某种响应。
  • 如果监听者没有注册到这个事件,那它就不会采取任何可观察到的公共行为。

测试一个触发事件

事件相关代码

public class Presenter
{
    private readonly IView _view;

    public Presenter(IView view)
    {
        _view = view;
        //在触发事件后调用OnLoaded方法
        this._view.Loaded += OnLoaded;

    }

    private void OnLoaded()
    {
        _view.Render("Hello World");
    }
}

还有一个接口

public interface IView
{
    event Action Loaded;
    event Action<string> ErrorOccured;
    void Render(string text);
}

测试事件触发

  • 这个模拟对象同时也是存根(桩)
  • 要触发这个事件,在测试时就要注册这个事件
[Test]
public void ctor_WhenViewIsLoaded_CallsViewRender()
{
    var mockView = Substitute.For<IView>();

    Presenter p = new Presenter(mockView);
    //使用NSubstitute触发事件
    mockView.Loaded += Raise.Event<Action>();

    //验证测试中是否调用了view的Render方法
    mockView.Received().Render(Arg.Is<string>(s => s.Contains("Hello World")));
}

测试有两个依赖的事件

被测代码

//有两个依赖,一个日志和一个视图
class Presenter2
{
    private readonly IView _view;
    private readonly ILogger _log;

    public Presenter2(IView view, ILogger log)
    {
        _view = view;
        _log = log;
        //发生Loaded事件时,调用OnLoaded
        this._view.Loaded += OnLoaded;
        //发生ErrorOccured事件时,调用OnError()方法,接收一个text
        this._view.ErrorOccured += OnError;
    }

    private void OnError(string text)
    {
        _log.LogError(text);
    }

    private void OnLoaded()
    {
        _view.Render("Hello World");
    }
}

测试模拟一个日志对象和一个视图

//模拟一个日志对象和一个视图
[Test]
public void ctor_WhenViewHasError_CallsLogger()
{
    var stubView = Substitute.For<IView>();
    var mockLogger = Substitute.For<ILogger>();

    Presenter2 p = new Presenter2(stubView, mockLogger);

    //1. 桩触发错误事件,由于OnError方法需要一个string所以事件要带一个参数
    stubView.ErrorOccured += Raise.Event<Action<string>>("fake error");

    //2. 使用模拟对象检查日志调用
    mockLogger.Received().LogError(Arg.Is<string>(s => s.Contains("fake error")));
}

测试事件是否触发

比较简单的方法是:在测试方法内部使用一个匿名委托,手工注册这个方法。下面是伪代码。

//测试事件是否触发
//比较简单的方法是:在测试方法内部使用一个匿名委托,手工注册这个方法。下面是伪代码。
[Test]
public void EventFiringManual()
{
    bool loadFired = false;
    SomeView view = new SomeView();
    //这个委托只记录这个事件是否触发
    view.Load += Delegate
    {
        loadFired = true;
    };
    view.DoSomethingThatEventuallyFiresThisEvent();
    Assert.IsTrue(loadFired);
}

© 著作权归作者所有

z

zhv

粉丝 0
博文 22
码字总数 18361
作品 0
西安
QA/测试工程师
私信 提问
Rackspace 开源 Whiskey 测试框架

全球托管服务巨头Rackspace近日宣布开源其Whiskey测试框架。 Whiskey是一套用于测试Node.js应用、事件驱动的、基于JavaScript的web应用框架,使用谷歌的V8 JavaScript引擎来提供实时编译性能...

虫虫
2012/03/20
1K
0
Splunk ES的风险评分功能

风险分析框架作为Splunk ES的的一项重要功能模块,为用户提供了利用风险评分系统的能力,为不同的资产和身份分配不同程度的风险。 1 风险评分概述 风险分析框架作为Splunk ES的的一项重要功能...

10data
2017/12/28
0
0
揭秘!阿里海量活动素材是如何做到亿级用户精准投放的?

点击上方“java进阶架构师”,选择右上角“置顶公众号” 20大进阶架构专题每日送达 01背景 随着闲鱼用户快速增长,运营活动越来越趋于精细和个性化,运营会根据用户偏好为其投放合适的活动,...

Java进阶架构师
05/09
0
0
读耗子叔的《从Equifax信息泄露看数据安全》

本文永久地址:https://www.cnblogs.com/erbiao/p/9214219.html 最近正好看到耗子叔《从Equifax信息泄露看数据安全》这篇文章,就来说一下这篇文章给我带来的一些东西。在上一篇文章中主要介...

大松哥
2018/06/22
0
0
渗透测试03------windows日常巡检,应急响应等总结

一:日常巡检: 1.日志: a:事件查看器中,查看日志。应用程序,安全性,系统,观察是否被入侵。 b:查看历史记录在c:DOCUMENTS AND SETTINGS c:修改后门账号密码。进去查看历史浏览网页等一些...

Tail__
2017/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
6
0
Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部