我发现关于TDD的事情是它需要时间来设置你的测试并且自然是懒惰的我总是想写尽可能少的代码.我似乎做的第一件事是测试我的构造函数已经设置了所有的属性,但这是否有点过分?
我的问题是你在单元测试中写出了什么级别的粒度?
..是否有一个测试太多的情况?
为了帮助我的团队编写可测试的代码,我提出了这个简单的最佳实践列表,以使我们的C#代码库更易于测试.(有些观点指的是Rhino Mocks的限制,这是C#的模拟框架,但规则也可能更普遍适用.)有没有人有他们遵循的最佳实践?
要最大限度地提高代码的可测试性,请遵循以下规则:
首先编写测试,然后编写代码.原因:这可确保您编写可测试代码,并确保每行代码都为其编写测试.
使用依赖注入设计类.原因:你无法模拟或测试无法看到的东西.
使用Model-View-Controller或Model-View-Presenter将UI代码与其行为分开.原因:允许在无法测试的部分(UI)最小化的同时测试业务逻辑.
不要编写静态方法或类. 原因:静态方法难以或无法隔离,Rhino Mocks无法模拟它们.
编程关闭接口,而不是类.原因:使用接口阐明了对象之间的关系.接口应该定义对象从其环境中需要的服务.此外,可以使用Rhino Mocks和其他模拟框架轻松模拟接口.
隔离外部依赖项.原因:无法测试未解析的外部依赖项.
将您想要模拟的方法标记为虚拟.原因:Rhino Mocks无法模拟非虚方法.
我想确认一个值是十进制(或0),因此该数字应大于或等于零且小于1.
describe('percent',function(){
it('should be a decimal', function() {
var percent = insights.percent;
expect(percent).toBeGreaterThan(0);
expect(percent).toBeLessThan(1);
});
});
Run Code Online (Sandbox Code Playgroud)
我如何模仿"> = 0"?
是否有人可以清楚地定义这些测试级别,因为我发现在进行TDD或单元测试时难以区分.如果有人能详细说明何时,何时实施这些?
testing tdd integration-testing unit-testing regression-testing
什么是在MINITEST的检查异常消息预期的语法assert_raises/ must_raise?
我正在尝试做出如下所示的断言,其中"Foo"是预期的错误消息:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Run Code Online (Sandbox Code Playgroud) 在TDD开发中,您通常首先要创建接口,然后开始针对该接口编写单元测试.当您逐步完成TDD过程时,您最终会创建一个实现接口的类,然后在某些时候您的单元测试将通过.
现在我的问题是关于我可能必须在我的类中编写的私有和受保护的方法,以支持接口公开的方法/属性:
班级中的私有方法是否应该有自己的单元测试?
班级中受保护的方法是否应该有自己的单元测试?
我的想法:
特别是因为我正在编写接口,我不应该担心受保护/私有方法,因为它们是黑盒子.
因为我正在使用接口,所以我正在编写单元测试以验证定义的合同是否由实现接口的不同类正确实现,所以我再也不担心私有/受保护的方法,并且应该通过调用它的单元测试来执行它们.接口定义的方法/属性.
如果我的代码覆盖率没有显示受保护/私有方法被命中,那么我没有正确的单元测试,或者我有没有被使用的代码,应该被删除.
我已经开始了很长时间的艰苦探索,学习并将TDD 应用到我的工作流程中.我认为TDD与IoC原理非常吻合.
在SO中浏览了一些TDD标记问题之后,我认为对接口而不是对象进行编程是一个好主意.
您能提供简单的代码示例,说明这是什么,以及如何在实际使用案例中应用它?简单的例子对我(以及其他想要学习的人)掌握概念至关重要.
非常感谢.
当我在MVC 2预览1中使用DataAnnotation验证时,如何在验证实体时测试我的控制器操作是否在ModelState中放置了正确的错误?
一些代码来说明.一,行动:
[HttpPost]
public ActionResult Index(BlogPost b)
{
if(ModelState.IsValid)
{
_blogService.Insert(b);
return(View("Success", b));
}
return View(b);
}
Run Code Online (Sandbox Code Playgroud)
这是一个失败的单元测试,我认为应该通过但不是(使用MbUnit和Moq):
[Test]
public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error()
{
// arrange
var mockRepository = new Mock<IBlogPostSVC>();
var homeController = new HomeController(mockRepository.Object);
// act
var p = new BlogPost { Title = "test" }; // date and content should be required
homeController.Index(p);
// assert
Assert.IsTrue(!homeController.ModelState.IsValid);
}
Run Code Online (Sandbox Code Playgroud)
我想除了这个问题,应该我来测试验证,并应在我这种方式测试它?
我试图模拟对索引属性的调用.即我想moq以下:
object result = myDictionaryCollection["SomeKeyValue"];
Run Code Online (Sandbox Code Playgroud)
以及设定值
myDictionaryCollection["SomeKeyValue"] = myNewValue;
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我需要模拟我的应用程序使用的类的功能.
有谁知道如何用MOQ做到这一点?我尝试过以下变化:
Dictionary<string, object> MyContainer = new Dictionary<string, object>();
mock.ExpectGet<object>( p => p[It.IsAny<string>()]).Returns(MyContainer[(string s)]);
Run Code Online (Sandbox Code Playgroud)
但那不编译.
我想用MOQ实现的目标是什么,有没有人有任何我可以做到这一点的例子?
我正在尝试使用TDD和新的XCTest框架编写iOS应用程序.我的一个方法从Internet检索文件(给定NSURL对象)并将其存储在用户的文档中.该方法的签名类似于:
- (void) fetchAndStoreImage:(NSURL *)imageUrl
Run Code Online (Sandbox Code Playgroud)
我正在尝试为这种方法编写测试,如果没有连接到互联网就不会失败.我的方法(取自上一个问题)是使用NSURL将方法调用到本地文件系统中的图像.
当创建启用了单元测试的新项目时,Tests目录有一个名为"Supporting Files"的子目录.我想这是我的测试图像应该去的地方.我的问题是如何获得指向此目录中的图像的NSURL对象,因为我不希望测试图像与应用程序捆绑在一起.任何帮助表示赞赏.
tdd ×10
unit-testing ×5
c# ×3
.net ×1
asp.net-mvc ×1
assertion ×1
ios ×1
jasmine ×1
javascript ×1
minitest ×1
mocking ×1
moq ×1
nsbundle ×1
rhino-mocks ×1
ruby ×1
testing ×1
validation ×1
xctest ×1