.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.概述 单 ...
随机推荐
- Windows Phone开发(29):隔离存储C
原文:Windows Phone开发(29):隔离存储C 本文是隔离存储的第三节,大家先喝杯咖啡放松,今天的内容也是非常简单,我们就聊一件东东--用户设置. 当然了,可能翻译为应用程序设置合适一些,不 ...
- vs2012 它已停止工作 - 解决方案
最近学习<Windows多媒体编程>本课程, 蛋疼, 学校原来是MFC... 然后安装vs2012. 后来又在几个插件.. 在这个问题. 开业,提示 vs2012 它已停止工作. wa ...
- hdu2457 Trie图+dp
hdu2457 给定n个模式串, 和一个文本串 问如果修改最少的字符串使得文本串不包含模式串, 输出最少的次数,如果不能修改成功,则输出-1 dp[i][j] 表示长度为i的字符串, 到达状态j(Tr ...
- hdu2242(树形dp+tarjan+缩点)
hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...
- POJ2676 Sudoku [数独]
好题,也非常有用,犯了几个错误 1.在枚举赋值的时候,思维有个错误:当当前的赋值不能填完这个数独,应该是继续下一个循环,而不是return false 终止枚举 2.Generic Programin ...
- Naive Bayes Classification
Maching Learning QQ群:2 请说明来自csdn 微信:soledede
- 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 解决Centos 7 dhcp服务器-no subnet declaration for start (no IPV4 addresses.)
上面的配置是hyper-v 安装的 centos 7.0 安装dhcp 服务器的方法是 yum install dhcpd 在安装和配置好后,运行的时候出现错误 错误提示如下: no subnet d ...
- C语言中的函数指针
C语言中的函数指针 函数指针的概念: 函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...
- 超赞的.NET办公软件库
之前做项目无意中搜到这个站点,一開始以为是国外大牛们的杰作,然后看到联系地址中竟然是四川成都,喔...咱们中国人跟老美.印度人比起来也非常厉害啊. 这个站点一次性提供了word.excel.ppt.p ...