.NET单元测试艺术(3) - 使用桩对象接触依赖
List 3.1 抽取一个设计文件系统的类,并调用它
[Test]
public bool IsValidLogFileName(string fileName)
{
FileExtensionManager mgr = new FileExtensionManager();
return mgr.IsValid(fileName);
}
class FileExtensionManager
{
public bool IsValid(string fileName)
{
// Read file
return true;
}
}
List 3.2 从一个已知类中抽取一个接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AOUT.LogAn
{
public interface IExtensionManager
{
bool IsValid(string fileName);
}
public class FileExtensionManager : IExtensionManager
{
public bool IsValid(string fileName)
{
// ...
return true;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace AOUT.LogAn
{
public class LogAnalyzer
{
// File to be tested
public bool IsValidLogFileName(string fileName)
{
IExtensionManager mgr = new FileExtensionManager();
return mgr.IsValid(fileName);
}
}
}
List 3.3 永远返回true的简单桩对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AOUT.LogAn
{
public class StubExtensionManager : IExtensionManager
{
public bool IsValid(string fileName)
{
return true;
}
}
}
List 3.4 通过构造函数注入桩对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace AOUT.LogAn
{
public class LogAnalyzer
{
private IExtensionManager _manager;
public LogAnalyzer()
{
_manager = new FileExtensionManager();
}
public LogAnalyzer(IExtensionManager mgr)
{
_manager = mgr;
}
// Method to be tested
public bool IsValidLogFileName(string fileName)
{
return _manager.IsValid(fileName);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace AOUT.LogAn.Tests
{
[TestFixture]
public class LogAnalyzerTests
{
[Test]
public void IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse()
{
StubExtensionManager myFakeManager = new StubExtensionManager();
myFakeManager.ShouldExtensionBeValid = true;
LogAnalyzer log = new LogAnalyzer(myFakeManager);
bool result = log.IsValidLogFileName("short.ext");
Assert.IsFalse(result, "File name with less than 5 chars should have failed the method," +
"even if the extension is supported");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AOUT.LogAn
{
public class StubExtensionManager : IExtensionManager
{
private bool _shouldExtensionBeValid;
public bool ShouldExtensionBeValid
{
get { return _shouldExtensionBeValid; }
set { _shouldExtensionBeValid = value; }
}
public bool IsValid(string fileName)
{
return ShouldExtensionBeValid;
}
}
}
.NET单元测试艺术(3) - 使用桩对象接触依赖的更多相关文章
- [Test] 单元测试艺术(2) 打破依赖,使用模拟对象,桩对象,隔离框架
在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破 ...
- [Test] 单元测试艺术(1) 基础知识
单元测试不是软件开发的新概念,在1970年就一直存在,屡屡被证明是最理想的方法之一. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,测试框架 创建优秀的单元测试 本节索引: 单 ...
- spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象
相关 知识 >>> 相关 练习 >>> 实现要求: 在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXm ...
- .NET单元测试艺术(1) - 单元测试的基本知识
List 1.1 一个要测试的SimpleParser类 using System; namespace AOUT.CH1.Examples { public class SimpleParser { ...
- .NET单元测试艺术(2) - 第一个单元测试
List 2.1 使用[SetUp]和[TearDown]特性 using System; using System.Collections.Generic; using System.Linq; u ...
- Spring 中初始化一个Bean对象时依赖其他Bean对象空指针异常
1. Bean依赖关系 一个配置类的Bean,一个实例Bean: 实例Bean初始化时需要依赖配置类的Bean: 1.1 配置类Bean @ConfigurationProperties(prefix ...
- 谈谈php对象的依赖
通过构造函数的方法 <?php //定义一个类,后面的类依赖这个类里面的方法 class play { public function playing() { echo "I can ...
- Mvc controller单元测试 Mock Url对象
被测试Action 包含有Url对象的代码: data = new data { title = ds.Name, icon = "folder", attr = new { id ...
- 基于spring与mockito单元测试Mock对象注入
转载:http://www.blogjava.net/qileilove/archive/2014/03/07/410713.html 1.关键词 单元测试.spring.mockito 2.概述 单 ...
随机推荐
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- An Overview of Complex Event Processing
An Overview of Complex Event Processing 复杂事件处理技术概览(一) 翻译前言:我在理解复杂事件处理(CEP)方面一直有这样的困惑--为什么这种计算模式是有效的, ...
- js中escape的用法----前端页面简单加密
escape() 方法,它用于转义不能用明文正确发送的任何字符.比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符. http://localhost:8080/a?na ...
- CentOS7+Tomcat 生产系统部署
1 准备OS账户 安全起见,本着最小权限原则,生产系统决不同意使用root账户来执行tomcat.为此,建立新账户tomcat,并设定登录password. useradd tomcat passwd ...
- uva 11992 为矩阵更新查询段树
http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...
- _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
- mtk硬件项目开始关闭蓝牙功能:mtk 硬件ScanCode和keycode应用演示示例
项目要求:该项目因为没有使用android5.0,导致启动bluetooth的蓝牙audio slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制.UI界面是通 ...
- 他们主动布局(autolayout)环境的图像编辑器
hi,all: 在经过了一番犹豫之后.我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发.仅供学习參考之用. 之前代码是托管与gitlab 上的,今天我将其pull ...
- STL源代码剖析(一) - 内存分配
Allocaor allocator 指的是空间配置器,用于分配内存.STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好.SGI STL也定义有一个符 ...
- poj 1466 Girls and Boys (最大独立集)
链接:poj 1466 题意:有n个学生,每一个学生都和一些人有关系,如今要你找出最大的人数.使得这些人之间没关系 思路:求最大独立集,最大独立集=点数-最大匹配数 分析:建图时应该是一边是男生的点, ...