小编csh*_*olk的帖子

关于如何编写重构友好单元TDD测试的提示

我已经在ASP.NET MVC项目上工作了大约8个月了.在大多数情况下,我一直在使用TDD,只有在我编写实际代码之后才能通过单元测试来涵盖某些方面.总的来说,该项目的测试覆盖率非常高.

到目前为止,我对结果非常满意.重构真的更容易,我的测试帮助我在第一次运行我的软件之前发现了很多错误.此外,我开发了更复杂的假货和帮手,以帮助我最小化测试代码.

但是,我不喜欢的事实是,我经常发现自己必须更新现有的单元测试,以解释我对软件所做的重构.重构软件现在快速而轻松,但重构我的单元测试非常乏味和乏味.实际上,维护我的单元测试的成本高于首先编写它们的成本.

我想知道我是否可能做错了,或者测试开发与测试维护成本的关系是否正常.我已经尝试过编写尽可能多的测试,以便这些测试覆盖我的用户故事,而不是像本博客文章中所建议的那样系统地覆盖我的对象界面.

另外,您是否有关于如何编写TDD测试的进一步提示,以便重构尽可能少地进行测试?

编辑:正如Henning和tvanfosson正确评论的那样,通常设置部分的编写和维护成本最高.破坏的测试(根据我的经验)通常是对域模型进行重构的结果,这些重构与这些测试的设置部分不兼容.

tdd refactoring unit-testing

13
推荐指数
1
解决办法
1381
查看次数

Java 8中多维数组的方法引用

在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数组(对我而言,它看起来像语言设计的不一致)?

java lambda language-lawyer java-8 method-reference

8
推荐指数
1
解决办法
876
查看次数

Java 8 Collector UNORDERED特性是什么意思?

在官方文档中,您可以阅读:

UNORDERED 指示集合操作不承诺保留输入元素的遭遇顺序.

没有任何例子,这没有太大帮助.

我的问题是,UNORDERED特征究竟意味着什么?我应该使用减少收集器,如min或sum,还是只适用于收集器?

在OpenJDK看起来像减少操作(min,sum,avg)具有空特征.我预计至少发现有CONCURRENTUNORDERED.

java java-8 java-stream collectors

7
推荐指数
2
解决办法
1004
查看次数

VSCode FSharp交互式终端中的奇怪字符

我尝试在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快捷键执行命令时

mono f# visual-studio-code

6
推荐指数
1
解决办法
330
查看次数

选择的初始值未在AngularJS中设置

在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问题......

angularjs

5
推荐指数
1
解决办法
641
查看次数

为什么没有构造函数参数约束C#中的泛型参数?

众所周知,我们不能在当前版本的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#中没有实现此功能,是否有可能在下一版本的语言中添加它?

c# language-design

5
推荐指数
1
解决办法
121
查看次数

Scala匹配和引用相等性检查

根据变量类型的不同,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) …

scala

2
推荐指数
1
解决办法
38
查看次数

C99 中指向数组开始之前的元素

我有一个整数数组:

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数组是由我的函数返回的,因此我无法在数组开头分配虚拟元素。

当您不取消引用该指针时,指向数组之前的一个元素是否有效(例如,当数组位于内存页边界上时)?或者是否有其他解决方案不那么棘手并且具有良好的性能?

c arrays pointers c99

0
推荐指数
1
解决办法
267
查看次数