Questions tagged «unit-testing»

单元测试是一种测试源代码的各个单元以确定它们是否适合使用的方法。

3
测试自定义验证angularjs指令
此自定义验证指令是官方角度网站上提供的示例。 http://docs.angularjs.org/guide/forms会 检查文本输入是否为数字格式。 var INTEGER_REGEXP = /^\-?\d*$/; app.directive('integer', function() { return { require: 'ngModel', link: function(scope, elm, attrs, ctrl) { ctrl.$parsers.unshift(function(viewValue) { if (INTEGER_REGEXP.test(viewValue)) { // it is valid ctrl.$setValidity('integer', true); return viewValue; } else { // it is invalid, return undefined (no model update) ctrl.$setValidity('integer', false); return undefined; } …

14
如何模拟要测试的数据库(Java)?
我正在用Java编程,而我的应用程序正在大量使用DB。因此,对我来说重要的是能够轻松测试数据库的使用情况。 什么是DB测试?对我来说,他们应该提供两个简单的要求: 验证SQL语法。 更重要的是,根据给定情况检查数据是否正确选择/更新/插入。 那么,看来我只需要一个DB。 但是实际上,我不喜欢,因为使用数据库进行测试几乎没有困难: “只给自己一个测试数据库,这有多难?” -嗯,在我的工作场所,拥有个人测试数据库几乎是不可能的。您必须使用每个人都可以访问的“公共”数据库。 “这些测试肯定不会很快...”-DB测试往往比常规测试慢。进行缓慢的测试真的不理想。 “此程序应处理任何情况!” -在数据库中尝试模拟每种情况变得有些烦人,甚至是不可能的。对于每种情况,都应进行一定数量的插入/更新查询,这很烦人并且需要时间。 “请稍等,您怎么知道该表中有542行?” -测试的主要原则之一是能够以与测试代码不同的方式测试功能。使用数据库时,通常有一种方法可以执行某项操作,因此测试与核心代码完全相同。 因此,您可以发现测试时我不喜欢数据库(当然,在某些时候,我必须要解决这个问题,但是当我发现大多数错误是通过使用其余的测试方法)。但是我在找什么呢? 我正在寻找一种使用文件系统或虚拟内存来模拟数据库,模拟数据库的方法。我以为可能有一个Java工具/程序包,可让每个测试简单地(使用代码接口)构造一个数据库模拟,模拟表和行,SQL验证以及用于监视其状态的代码接口(而不是使用SQL) )。 您熟悉这种工具吗? 编辑:感谢您的答案!尽管我在寻找工具,但是您也向我提供了有关该问题的提示:)我将花一些时间检查您的报价,所以我现在无法确定您的答案是否令人满意。 无论如何,这是我正在寻找的更好的视图-想象一下一个名为DBMonitor的类,它的功能之一就是查找表中的行数。这是我想如何使用JUnit测试该功能的虚构代码: public class TestDBMonitor extends TestCase { @Override public void setUp() throws Exception { MockConnection connection = new MockConnection(); this.tableName = "table1"; MockTable table = new MockTable(tableName); String columnName = "column1"; ColumnType …

4
如何编写用于与外部API交互的集成测试?
首先,我的知识是: 单元测试是那些测试一小段代码(大多数是单一方法)的测试。 集成测试是测试多个代码区域之间的交互的测试(希望它们已经具有自己的单元测试)。有时,被测代码的某些部分需要其他代码以特定方式起作用。这是Mocks&Stubs出现的地方。因此,我们模拟/存根代码的一部分以非常具体地执行。这使我们的集成测试可以预期地运行而没有副作用。 所有测试都应能够独立运行而无需数据共享。如果必须进行数据共享,则表明系统耦合不够充分。 接下来,我面临的情况是: 与外部API(特别是RESTful API,将通过POST请求修改实时数据)进行交互时,我了解我们可以(应该吗?)模拟出与该API的交互(在此答案中更雄辩地说),以进行集成测试。我也了解我们可以对与该API交互的各个组件进行单元测试(构造请求,解析结果,抛出错误等)。我不明白的是如何真正做到这一点。 所以,最后:我的问题。 如何测试与具有副作用的外部API的交互? 谷歌的Content API for shopping是一个很好的例子。为了能够执行手头的任务,需要大量的准备工作,然后执行实际的请求,然后分析返回值。其中一些没有任何“沙盒”环境。 执行此操作的代码通常具有相当多的抽象层,例如: <?php class Request { public function setUrl(..){ /* ... */ } public function setData(..){ /* ... */ } public function setHeaders(..){ /* ... */ } public function execute(..){ // Do some CURL request or some-such } …

6
Java单元测试,目录布局
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 1年前关闭。 改善这个问题 在为Java代码构建一套单元测试时,是否有关于将测试代码与源代码放置在何处的约定? 例如,如果我有一个/java包含一堆.java源文件的目录,那么最好将测试用例/java本身放在其中或使用类似的内容/java/test。 如果首选后者,那么在包外部无法使用类的private /protected成员时,如何测试代码的内部?

3
XCTAssertEqual无法比较两个字符串值?
我添加了一个简单的单元测试来测试我的字符串扩展。但是失败了。我在这里做错了什么? 据我所知XCTAssertEqual,测试价值而不是对象本身? 第三行顺便说一句,说字符串是相等的,但是XCTAssertEqual说不一样。 - (void) testInitialsFromFullname { NSString *firstNickName = @"Mike Kain"; NSString *expectedResult = @"MK"; NSLog(@"Equal:%@", [[firstNickName initialsFromString] isEqualToString:expectedResult] ? @"YES" : @"NO"); XCTAssertEqual(expectedResult, [firstNickName initialsFromString], @"Strings are not equal %@ %@", expectedResult, [firstNickName initialsFromString]); }

4
多个Moq It.Is <string>()匹配参数
使用Moq,拥有多个匹配参数是否有效? It.Is&lt;string&gt;() 在此示例中,我希望mockMembershipService返回一个不同的ProviderUserKey,具体取决于提供的用户。 mockMembershipService.Setup( x =&gt; x.GetUser( It.Is&lt;string&gt;( s =&gt; s.Contains("Joe"))) .ProviderUserKey) .Returns("1234abcd"); mockMembershipService.Setup( x =&gt; x.GetUser( It.Is&lt;string&gt;( s =&gt; s.Contains("Tracy"))) .ProviderUserKey) .Returns("5678efgh"); SetUp默认为第二条语句,而不是根据各自的价值进行评估。
76 c#  unit-testing  mocking  moq 

13
运行单元测试时如何获取目录
嗨,当我运行单元测试时,我想获取我的项目正在运行的目录以检索文件。 假设我有一个名为MyProject的测试项目。测试我运行: AppDomain.CurrentDomain.SetupInformation.ApplicationBase 我收到了"C:\\Source\\MyProject.Test\\bin\\Debug"。 这接近我的追求。我不希望bin\\Debug部分。 有人知道我怎么能得到"C:\\Source\\MyProject.Test\\"吗?

6
猴子在Python的另一个模块中修补类
我正在使用其他人编写的模块。我想猴子修补__init__模块中定义的类的方法。我发现的示例显示了如何执行此操作的所有示例,都假设我自己将自己称为该类(例如Monkey-patch Python类)。然而,这种情况并非如此。在我的情况下,该类是在另一个模块的函数中初始化的。请参阅下面的(大大简化的)示例: thirdpartymodule_a.py class SomeClass(object): def __init__(self): self.a = 42 def show(self): print self.a thirdpartymodule_b.py import thirdpartymodule_a def dosomething(): sc = thirdpartymodule_a.SomeClass() sc.show() mymodule.py import thirdpartymodule_b thirdpartymodule_b.dosomething() 有什么方法可以修改的__init__方法,例如,SomeClass当dosomething从mymodule.py调用该方法时,它显示43而不是42?理想情况下,我将能够包装现有方法。 我不能更改thirdpartymodule * .py文件,因为其他脚本取决于现有功能。我宁愿不必创建自己的模块副本,因为我需要进行的更改非常简单。 编辑2013-10-24 在上面的示例中,我忽略了一个很小但很重要的细节。SomeClass是这样导入的thirdpartymodule_b:from thirdpartymodule_a import SomeClass。 要执行FJ建议的补丁,我需要替换其中的副本thirdpartymodule_b,而不是thirdpartymodule_a。例如thirdpartymodule_b.SomeClass.__init__ = new_init。

3
Python模拟中的模拟属性?
我mock在Python中使用时遇到了一些困难: def method_under_test(): r = requests.post("http://localhost/post") print r.ok # prints "&lt;MagicMock name='post().ok' id='11111111'&gt;" if r.ok: return StartResult() else: raise Exception() class MethodUnderTestTest(TestCase): def test_method_under_test(self): with patch('requests.post') as patched_post: patched_post.return_value.ok = True result = method_under_test() self.assertEqual(type(result), StartResult, "Failed to return a StartResult.") 测试实际上返回正确的值,但r.ok它是Mock对象,不是True。您如何在Pythonmock库中模拟属性?

4
Angular 2/4/6/7-使用路由器进行单元测试
在Angular 2.0.0中,我正在对使用路由器的组件进行单元测试。但是我得到“提供的参数与呼叫目标的任何签名都不匹配。” 错误。在spec.ts中的Visual Studio代码中,新的Router()以红色突出显示 如果有人能让我知道正确的语法,我将不胜感激。提前致谢。我的代码如下: 规格 import { TestBed, async } from '@angular/core/testing'; import { NavToolComponent } from './nav-tool.component'; import { ComponentComm } from '../../shared/component-comm.service'; import { Router } from '@angular/router'; describe('Component: NavTool', () =&gt; { it('should create an instance', () =&gt; { let component = new NavToolComponent( new ComponentComm(), …

6
断言使用多个参数中的一个参数调用方法
我正在模拟requests.post使用该Mock库的调用: requests.post = Mock() 该调用涉及多个参数:URL,有效负载,一些身份验证内容等。我想断言requests.post使用特定的URL进行调用,但我不在乎其他参数。当我尝试这个: requests.post.assert_called_with(requests_arguments) 测试失败,因为它期望仅使用该参数来调用它。 有什么方法可以检查是否在函数调用中的某个地方使用了单个参数,而不必传入其他参数? 或者,甚至更好的方法是,有一种方法可以断言特定的URL,然后为其他参数抽象数据类型(即,数据应为字典,auth应该为HTTPBasicAuth的实例,等等)?

4
模拟或存根以进行链式通话
protected int parseExpire(CacheContext ctx) throws AttributeDefineException { Method targetMethod = ctx.getTargetMethod(); CacheEnable cacheEnable = targetMethod.getAnnotation(CacheEnable.class); ExpireExpr cacheExpire = targetMethod.getAnnotation(ExpireExpr.class); // check for duplicate setting if (cacheEnable.expire() != CacheAttribute.DO_NOT_EXPIRE &amp;&amp; cacheExpire != null) { throw new AttributeDefineException("expire are defined both in @CacheEnable and @ExpireExpr"); } // expire time defined in @CacheEnable …

1
MOQ-如何模拟需要转换为另一个接口的接口?
我想做的是为I1构造一个最小起订量-很好...但是,在我测试的使用此模拟程序的方法的过程中,我需要将其强制转换为I2才能访问某些未启用的属性I1 Interface I1 { int AProperty{get;set;}} Interface I2 {int AnotherProperty{get;set;}} 然后我有一些东西 Class O1 : I1 {} 和 Class O2 : O1 , I2 {} 问题是,当我拥有I2实现对象的实例时,可以将其强制转换为I1以便访问通过该接口实现的方法。在代码中这不是问题,一切都能按预期进行。 唯一的问题是在该类上编写单元测试时。 这些接口还公开了一个名为GetNewInstance的方法,该方法返回转换为IGetNewInstance接口的实现对象的初始化实例……我通常可以对此进行模拟并使其自身返回(因此我继续使用模拟对象)。 但是,当您尝试将此类型为I2的返回对象转换为I1时,将返回空引用-这很有意义,因为实现I2的模拟对象不会继承任何继承I1的对象。 问题是如何强制模拟对象同时从两个I1和Id继承?

15
在JavaScript中模拟用户代理?
我正在寻找一种以编程方式实时更改navigator.userAgent的方法。在尝试获得自动化javascript单元测试器的失败尝试中,我放弃了尝试尝试使用fireunit。立即,我陷入了使用实际浏览器进行JavaScript测试的一堵墙。 具体来说,我需要更改navigator.userAgent以模拟数百个userAgent字符串,以确保对给定函数进行正确的检测和覆盖。navigator.userAgent是只读的,所以我似乎卡住了!如何模拟navigator.userAgent?用户代理切换器(插件)可以切换FF的用户代理,但是我可以在JavaScript中进行切换吗?

9
在私人方法上使用茉莉花
是否可以在类私有方法上使用Jasmine单元测试框架的spyon方法? 文档提供了此示例,但是对于私有功能可以灵活使用吗? describe("Person", function() { it("calls the sayHello() function", function() { var fakePerson = new Person(); spyOn(fakePerson, "sayHello"); fakePerson.helloSomeone("world"); expect(fakePerson.sayHello).toHaveBeenCalled(); }); });

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.