我已经在ASP.NET MVC项目上工作了大约8个月了.在大多数情况下,我一直在使用TDD,只有在我编写实际代码之后才能通过单元测试来涵盖某些方面.总的来说,该项目的测试覆盖率非常高.
到目前为止,我对结果非常满意.重构真的更容易,我的测试帮助我在第一次运行我的软件之前发现了很多错误.此外,我开发了更复杂的假货和帮手,以帮助我最小化测试代码.
但是,我不喜欢的事实是,我经常发现自己必须更新现有的单元测试,以解释我对软件所做的重构.重构软件现在快速而轻松,但重构我的单元测试非常乏味和乏味.实际上,维护我的单元测试的成本高于首先编写它们的成本.
我想知道我是否可能做错了,或者测试开发与测试维护成本的关系是否正常.我已经尝试过编写尽可能多的测试,以便这些测试覆盖我的用户故事,而不是像本博客文章中所建议的那样系统地覆盖我的对象界面.
另外,您是否有关于如何编写TDD测试的进一步提示,以便重构尽可能少地进行测试?
编辑:正如Henning和tvanfosson正确评论的那样,通常设置部分的编写和维护成本最高.破坏的测试(根据我的经验)通常是对域模型进行重构的结果,这些重构与这些测试的设置部分不兼容.
在Java中我们可以IntFunction<String[]>
从1D数组构造函数引用创建:
// both do the same thing
IntFunction<String[]> createArrayL = size -> new String[size];
IntFunction<String[]> createArrayMR = String[]::new;
Run Code Online (Sandbox Code Playgroud)
现在我想知道为什么我们不能用2D数组做到这一点:
BiFunction<Integer, Integer, String[][]> createArray2DL =
(rows, cols) -> new String[rows][cols];
// error:
BiFunction<Integer, Integer, String[][]> createArray2DMR =
String[][]::new;
Run Code Online (Sandbox Code Playgroud)
我们当然可以写:
IntFunction<String[][]> createArray2DInvalidL = String[][]::new;
System.out.println(createArray2DInvalidL.apply(3)[0]); // prints null
Run Code Online (Sandbox Code Playgroud)
但这将表现得与以下不同:
new String[3][3]
Run Code Online (Sandbox Code Playgroud)
因为行数组不会被初始化.
所以我的问题是:为什么String[][]::new
不能用于2D数组(对我而言,它看起来像语言设计的不一致)?
在官方文档中,您可以阅读:
UNORDERED
指示集合操作不承诺保留输入元素的遭遇顺序.
没有任何例子,这没有太大帮助.
我的问题是,UNORDERED
特征究竟意味着什么?我应该使用减少收集器,如min或sum,还是只适用于收集器?
在OpenJDK看起来像减少操作(min,sum,avg)具有空特征.我预计至少发现有CONCURRENT
和UNORDERED
.
我尝试在Ubuntu下使用fsharp(是的,我慢慢发现它更有痛苦而不是乐趣),我已经安装了Mono,VSCode和Ionide扩展,我可以创建和构建F#项目.不幸的是,当我通过F#Interactive运行简单的F#脚本时:
printfn "bar"
Run Code Online (Sandbox Code Playgroud)
在终端窗口我得到:
>
- printfn "bar"
-
- ;;
bar
val it : unit = () F# 4.0 (Open Source Edition)
> ^?^?414;3R^?^?^?^?^?^? the Apache 2.0 Open Source License
Run Code Online (Sandbox Code Playgroud)
奇怪的序列^?^?
看起来像无法识别的终端转义码,但是当我在VSCode中使用bash时,没有这样的东西.
在FSI中执行的每个命令之后,更奇怪的序列再次出现:
> let j = 9;;
val j : int = 9
> printfn "foo";;
foo
val it : unit = ()
> ^?^?
Run Code Online (Sandbox Code Playgroud)
有没有人有同样的问题并且知道解决方案(或者只是知道解决方案)?
编辑:问题主要发生在我通过Ionide Alt + Enter快捷键执行命令时
在AngularJS 1.3应用程序中,我有一个表单,我从后端异步获取模型和选择控件的可能值.当我在使用值之前获得模型值时ng-options
,在选择控件中不会选择任何选项.我设法重现了这种行为:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $timeout) {
$scope.model = { value: 101 };
$timeout(function() {
$scope.model.values = [100, 101, 102, 103];
}, 1000);
});
Run Code Online (Sandbox Code Playgroud)
视图:
Options: <select ng-model="model.value"
ng-options="v for v in model.values">
<option value="">Select some...</option>
</select>
Run Code Online (Sandbox Code Playgroud)
超时模型具有旧值101但未选择任何选项.目前我通过使用ng-if="model.values"
select 来找到解决方法,但我觉得应该有更好的方法来做到这一点.
有人可以解释为什么没有选择选项吗?
Plunkr:http://plnkr.co/edit/4opZRJzdDfJhSNJx8RMF
编辑:我在Firefox中打开了Plunkr,然后我开始工作,然后我回到Chrome,它看起来不像crossbrowser问题......
众所周知,我们不能在当前版本的C#中编写这样的代码:
public class A {
public static void Method<T> () where T : new(string, string) {
var x = new T("foo", "bar");
}
}
Run Code Online (Sandbox Code Playgroud)
但我们可以使用new()
约束来强制执行T
具有公共参数的构造函数,然后我们就可以创建T
使用new T()
表达式的新实例.
有关各种解决方法的SO有很多答案,但没有解释为什么语言设计者没有实现这样的功能.从SO的问题数量来看,它似乎在阅读世界应用程序中很有用.
为什么在C#中没有实现此功能,是否有可能在下一版本的语言中添加它?
根据变量类型的不同,Scala有时匹配值,有时不匹配。这个简单的程序说明了这个问题:
class NotEqualToAnything {
override def equals(obj: Any): Boolean = false
}
val x = new NotEqualToAnything()
x match {
case `x` =>
println("WTF x equal to itself")
case _ =>
println("no-match") // This got printed
}
val y: AnyRef = new NotEqualToAnything()
y match {
case `y` =>
println("WTF y equal to itself") // This got printed
case _ =>
println("no-match")
Run Code Online (Sandbox Code Playgroud)
当变量的类型为时AnyRef
,生成的代码将包含一个调用,在调用之前BoxesRunTime.equals
确实会对其进行y == y
检查y.equals(y)
。当变量的类型为时NotEqualToAnything
,我们进行了x == null
两次标准检查,然后调用了x.equals(x) …
我有一个整数数组:
int* counters = (int *) calloc(N, sizeof(int));
Run Code Online (Sandbox Code Playgroud)
必须使用基于一个的索引进行索引,例如第一个元素的索引为 1,第二个元素的索引为 2,等等。由于性能非常重要,我决定使用一个技巧:
int* oneIndexedCounters = counters - 1;
Run Code Online (Sandbox Code Playgroud)
这允许我使用基于 1 的索引,而无需从索引中减去 1:
// A[i] - contains one based indexes
for (int i = 0; i < K; i++) {
oneIndexedCounters[A[i]] += B[i]; // many times in code
// some other operations on oneIndexedCounters
}
Run Code Online (Sandbox Code Playgroud)
插入:
for (int i = 0; i < K; i++) {
counters[A[i]-1] += B[i];
// ...
}
Run Code Online (Sandbox Code Playgroud)
counters
数组是由我的函数返回的,因此我无法在数组开头分配虚拟元素。
当您不取消引用该指针时,指向数组之前的一个元素是否有效(例如,当数组位于内存页边界上时)?或者是否有其他解决方案不那么棘手并且具有良好的性能?
java ×2
java-8 ×2
angularjs ×1
arrays ×1
c ×1
c# ×1
c99 ×1
collectors ×1
f# ×1
java-stream ×1
lambda ×1
mono ×1
pointers ×1
refactoring ×1
scala ×1
tdd ×1
unit-testing ×1