我已经为下面的行动编写了单元测试.
[HttpPost]
public ActionResult/*ViewResult*/ Create(MyViewModel vm)
{
if (ModelState.IsValid)
{
//Do something...
return RedirectToAction("Index");
}
return View(vm);
}
Run Code Online (Sandbox Code Playgroud)
测试方法Model只有在返回类型时才能访问属性ViewResult.在上面的代码中,我已经使用RedirectToAction过这种动作的返回类型不能ViewResult.
在这种情况下,您如何对一个动作进行单元测试?
如果您(或您的组织)希望对您的代码进行彻底的单元测试,那么您如何衡量您的成功或质量?
虽然单元测试似乎对API需要具有工业实力的大型项目(例如.Net框架API的开发等)有效,但似乎可能对小型项目有点过分.
什么时候自动TDD方法是最好的方式,什么时候可以更好地使用手动测试技术,记录错误,分类,修复它们等.
另一个问题 - 当我在微软的测试人员时,向我们强调,让开发人员和测试人员成为不同的人是有价值的,并且这两个群体之间的紧张关系有助于最终创造出一个伟大的产品.TDD可以打破这个想法并创造一种情况,开发人员可能不是严格找到自己错误的合适人选吗?它可能是自动化的,但似乎有很多方法可以编写测试,并且一组给定的测试是否"证明"质量是否可接受是值得怀疑的.
最近发现了这种开发方法,我发现它是一种相当不错的方法.所以,对于我的第一个项目,我有一个小DLL的代码(在C#.NET中,它的价值),我想为这段代码做一组测试,但我有点失去了如何和从哪儿开始.
我正在使用NUnit和VS 2008,任何关于什么类开始的提示,为什么编写测试,以及关于如何将代码移动到基于测试的开发的一般提示都将非常感激.
我在办公室工作,现在已经做了一段时间的敏捷.我们使用Scrum进行项目管理,并混合使用XP的工程实践.它运作良好,我们不断学习课程和完善我们的过程.
我想告诉您我们通常的测试实践,并获得有关如何改进的反馈:
TDD:第一道防线 我们对单元测试非常虔诚,我会说我们的开发人员也经验丰富,可以编写全面的测试,并始终将SUT与模拟隔离开来.
集成测试
对于我们的使用,集成测试基本上与不使用模拟的单元测试相同.这往往会抓住一些问题,这些问题在单元测试中滑落.这些测试往往是难以阅读,因为它们通常涉及在大量或工作before_each和after_each规范框架的部分作为系统,以便为测试是有意义的经常达到一定的状态.
功能测试 我们通常以结构化但手动的方式执行此操作.我们玩过Selenium和Windmill很酷,但对我们来说至少还没有.
我想知道其他人是怎么做的.你是否认为如果集成测试或功能测试做得好,另一个可以被忽视?
我有一个类有私有成员的类System.Windows.Forms.Timer.每次我的计时器滴答时都会调用一个私有方法.
编辑:
实际上,该方法依赖于时序,这里是代码:
private void alertTick(object sender, EventArgs e) {
if (getRemainingTime().Seconds <= 0) {
Display.execute(Name, WarningState.Ending, null);
AlertTimer.Stop();
}
else {
var warning = _warnings.First(x => x == getRemainingTime());
if (warning.TotalSeconds > 0)
Display.execute(Name, WarningState.Running, warning);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,如果计时器正在运行,它将Display.execute()从结束时(当剩余时间等于0时)使用不同的参数进行调用.这会是设计问题吗?
我一直试图找到一种合理的方法来测试使用流的代码.有没有人找到合理的方法/框架来帮助测试在nodejs中使用流的代码?
例如:
var fs = require('fs'),
request = require('request');
module.exports = function (url, path, callback) {
request(url)
.pipe(fs.createWriteStream(path))
.on('finish', function () {
callback();
});
};
Run Code Online (Sandbox Code Playgroud)
我目前测试这种类型代码的方法或者包括使用流来简化代码,以至于我可以将它抽象为未经测试的代码块,或者通过编写类似这样的代码:
var rewire = require('rewire'),
download = rewire('../lib/download'),
stream = require('stream'),
util = require('util');
describe('download', function () {
it('should download a url', function (done) {
var fakeRequest, fakeFs, FakeStream;
FakeStream = function () {
stream.Writable.call(this);
};
util.inherits(FakeStream, stream.Writable);
FakeStream.prototype._write = function (data, encoding, cb) {
expect(data.toString()).toEqual("hello world")
cb();
};
fakeRequest = function (url) {
var …Run Code Online (Sandbox Code Playgroud) 我是一名有很多经验的合同程序员.我习惯于被客户雇用进入我自己的某种形式的软件项目,通常是从零开始.这意味着几乎每次都是干净的石板.我可以引入我开发的库来快速启动,但它们总是可选的.(并且取决于在合同中获得正确的IP条款)很多时候我可以指定甚至设计硬件平台......所以我们在这里谈论严肃的自由.
我可以看到用于构建某些代码的自动化测试的用途:具有更多简单功能的库,具有大量引用的核心功能等.基本上,随着一段代码的价值在大量使用中上升,我可以看到它自动测试该代码将变得越来越有价值,以便我知道我不会破坏它.
然而,在我的情况下,我发现很难合理化任何东西.我会采用它们证明有用的东西,但我不会盲目跟随任何事情.
我发现我在"维护"中所做的很多事情实际上都是小的设计变化.在这种情况下,测试不会为我节省任何东西,现在他们也必须改变.高度迭代,存根优先的设计方法对我来说非常有效.通过更广泛的测试,我无法看到实际上节省了很多时间.
业余爱好项目更难以证明......他们通常都是从周末到月份的任何事情.边缘案例错误很少发生,它只是玩弄东西.
读书问题,比如这一个,最表决的反应似乎是说,在海报的经验/意见TDD实际上是浪费时间,如果你有少于5人(即使假设能力一定水平与TDD /经验).但是,这似乎涵盖了初始开发时间,而不是维护.目前尚不清楚TDD如何在项目的整个生命周期中叠加.
我认为TDD可以成为提高整个行业产品质量的有价值目标的一个很好的步骤.尽管如此,理想主义本身不再能够激励我.
我不认为TDD将是大团队是一个很好的做法,或含有至少一个不可靠的程序员任何规模的团队.那不是我的问题.
为什么一个拥有良好记录的唯一开发人员会采用TDD?
我很想知道在TDD上完成的任何指标(正式与否)......专注于独立开发人员或非常小的团队.
如果做不到这一点,你个人经历的轶事也会很好.:)
如果没有经验,请避免说出意见.让我们不要把它作为一场意识形态战争.此外,跳过更大的就业选择论点. 这只是一个效率问题.
我正在学习测试驱动开发并尝试使用Moq库进行模拟.Mock类的Setup方法的目的是什么?
使用Moq,如何使用输入参数设置方法调用作为具有预期属性值的对象?
var storageManager = new Mock<IStorageManager>();
storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));
Run Code Online (Sandbox Code Playgroud)
Add()方法需要具有FirstName属性的UserMetaData对象.
我想确保传递了具有FirstName为"FirstName1"的UserMetaData类型的对象.