我在MVCStoreFront应用程序上观看Rob Connerys的网络广播,我注意到他甚至是最普通的东西,例如:
public Decimal DiscountPrice
{
get
{
return this.Price - this.Discount;
}
}
Run Code Online (Sandbox Code Playgroud)
会有一个测试像:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,80);
}
Run Code Online (Sandbox Code Playgroud)
虽然,我都是单元测试,但我有时想知道这种形式的测试首次开发是否真的有益,例如,在实际过程中,您的代码上方有3-4层(业务请求,需求文档,架构文档) ,实际定义的业务规则(折扣价格是价格 - 折扣)可能被错误定义.
如果是这种情况,您的单元测试对您来说毫无意义.
此外,您的单元测试是另一个失败点:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,90);
}
Run Code Online (Sandbox Code Playgroud)
现在测试存在缺陷.显然,在一个简单的测试中,这没什么大不了的,但是我们说我们正在测试一个复杂的业务规则.我们在这里获得了什么?
快速推进应用程序生命的两年,当维护开发人员维护它时.现在业务改变了规则,测试再次中断,一些菜鸟开发人员然后错误地修复了测试......我们现在又有了另一个失败点.
我所看到的只是更多可能的失败点,没有真正有益的回报,如果折扣价格错误,测试团队仍然会发现问题,单元测试如何保存任何工作?
我在这里错过了什么?请教我爱TDD,因为到目前为止我很难接受TDD.我也想要,因为我想保持进步,但这对我来说没有意义.
编辑:有几个人一直提到测试有助于执行规范.根据我的经验,规范也是错误的,通常是错误的,但也许我注定要在一个组织中工作,这些组织的规范是由那些不应该编写规范的人编写的.
有没有办法(单元)测试我自己的HtmlHelpers?如果我想要自定义控件(由HtmlHelper呈现)并且我知道该控件的需求,我怎么能先编写测试 - 然后编写代码?有没有特定的(好的)方法呢?
这值得吗?
我在ASP.NET MVC应用程序中编写了一些自定义模型绑定器(实现IModelBinder).我想知道对它们进行单元测试的好方法(粘合剂)?
我想知道其他开发人员如何开始重构.你的第一步是什么?如果你重构不属于你的代码,这个过程(重构)会有什么不同?你在重构时写测试吗?
我在ma网站上有一个很长的GridView控件.它允许行选择.问题是,当我向下滚动这个GridView并选择一些底行时,会发生选择,但整个GridView会滚动回顶部.enyone知道如何避免这种情况吗?
考虑以下服务块:
public class ProductService : IProductService {
private IProductRepository _productRepository;
// Some initlization stuff
public Product GetProduct(int id) {
try {
return _productRepository.GetProduct(id);
} catch (Exception e) {
// log, wrap then throw
}
}
}
Run Code Online (Sandbox Code Playgroud)
让我们考虑一个简单的单元测试:
[Test]
public void GetProduct_return_the_same_product_as_getProduct_on_productRepository() {
var product = EntityGenerator.Product();
_productRepositoryMock.Setup(pr => pr.GetProduct(product.Id)).Returns(product);
Product returnedProduct = _productService.GetProduct(product.Id);
Assert.AreEqual(product, returnedProduct);
_productRepositoryMock.VerifyAll();
}
Run Code Online (Sandbox Code Playgroud)
起初看起来这个测试还可以.但是让我们改变一下我们的服务方法:
public Product GetProduct(int id) {
try {
var product = _productRepository.GetProduct(id);
product.Owner = "totallyDifferentOwner";
return product;
} catch (Exception e) {
// …Run Code Online (Sandbox Code Playgroud) 我已经阅读了NHibernate 3允许在执行分页查询时(在一个数据库查询中)确定记录总数的某处(不能记住何处和如何).这是正确的吗?
我有这个代码:
public IEnumerable<X> GetOrganisms(int PageSize, int Page, out int total)
{
var query = (from e in Session.Query<X>() select e).AsQueryable();
return query.Skip((Page - 1) * PageSize).Take(PageSize).ToList();
}
Run Code Online (Sandbox Code Playgroud)
并希望尽可能有效地初始化"总数".
谢谢.
基督教
PS:
潜在的"解决方案"?:
Total = (int) Session.CreateCriteria<X>()
.SetProjection(Projections.RowCount())
.FutureValue<Int32>().Value;
var query = (from e in Session.Query<X>() select e).AsQueryable();
return query.Skip((Page - 1) * PageSize).Take(PageSize).ToList();
Run Code Online (Sandbox Code Playgroud) 我问过VS08.我有Web应用程序项目(vb.net).每当我尝试打开一个aspx或ascx时(在Source视图中 - 只需双击解决方案资源管理器)该文件就会打开,但是VS挂起并且没有响应.重新启动VS的唯一方法是杀死它的进程.并且它始终与这些类型的文件一起发生.:/重新安装不起作用.
另外,我用这个VS实例安装的唯一插件是ClearCase源代码控制插件.
unit-testing ×4
asp.net ×2
asp.net-mvc ×2
.net ×1
agile ×1
c# ×1
gridview ×1
html-helper ×1
mocking ×1
nhibernate ×1
refactoring ×1
regex ×1
repository ×1
service ×1
state ×1
tdd ×1
test-first ×1
uml ×1