许多人在编写单元测试时都使用模拟对象.什么是模拟对象?我为什么需要一个?我需要一个模拟对象框架吗?
我们有一大堆DLL,可以让我们访问我们的数据库和其他应用程序和服务.
我们已经使用瘦客户端然后使用的瘦WCF服务层包装这些DLL.
我对如何编写仅测试WCF服务层的单元测试有点不确定.我应该只编写DLL的单元测试,以及WCF服务的集成测试吗?我很欣赏任何智慧......我知道如果我的单元测试实际上进入数据库,它们实际上并不是真正的单元测试.我也明白我不需要在单元测试中测试WCF服务主机.
所以,我对确切测试的内容和方式感到困惑.
使用其他类(作为成员或作为方法的参数)的类需要具有适合单元测试的实例.如果你有这些类可用并且没有引入其他依赖项,那么使用真实的东西而不是模拟更好吗?
我是Moq的新手。我在嘲笑一PagingOptions堂课。这是该类的样子:
public class PagingOptions
{
[Range(1, 99999, ErrorMessage = "Offset must be greater than 0.")]
public int? Offset { get; set; }
[Range(1, 100, ErrorMessage = "Limit must be greater than 0 and less than 100.")]
public int? Limit { get; set; }
public PagingOptions Replace(PagingOptions newer)
{
return new PagingOptions
{
Offset = newer.Offset ?? Offset,
Limit = newer.Limit ?? Limit
};
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的模拟课程,
var mockPagingOptions = new Mock<PagingOptions>();
mockPagingOptions.Setup(po => po.Limit).Returns(25);
mockPagingOptions.Setup(po => po.Offset).Returns(0);
Run Code Online (Sandbox Code Playgroud)
设置属性值时出现以下错误。我在做错什么吗?看起来我无法Moq具体课程吗?只能模拟接口吗?请协助。 …
我的班级有依赖,我在单元测试中嘲笑.我在一个对我没有多大意义的地方得到了一个空引用异常.
我刚才意识到这是因为我没有设置我的模拟依赖.此依赖项已经过测试,但它不会连接到文件系统或数据源之类的任何内容.
我只想在这个新类中测试我的新代码,但我想在这种情况下最好不要去模拟.
这个结论是否正确?
我正在为我们的主要产品编写单元测试,并且有一个问题:如何区分
对于第一个,我们肯定有jUnit Assert框架,但是对于第二个框架我们有什么?
示例:我的单元测试是测试c()不会抛出MyException,但是为了执行c()我需要首先执行a()然后b(),它们都可以抛出MyException(),所以我会写:
@Test
public void testC() {
a();
Object forC = b();
try {
c(forC);
} catch (MyException e) {
Assert.fail("....");
}
}
Run Code Online (Sandbox Code Playgroud)
但是我需要处理可以被a或b抛出的MyException,并且还要处理forC不应该为null的事实.做这个的最好方式是什么?
你对这个问题的解决方案是什么?我可能会选择第二个,但我对它不满意,如上所述.
经过大量阅读后,我发现人们建议在单元测试下模拟方法中的每个依赖项。
但是,我有一个方法可以创建对象列表(依赖项)并使用这些对象的方法来更改列表。在现实场景中,该方法是将客户端发送的数据有效负载转换为这些对象。下面是 Typescript 中的代码实现,但它只是给你一个想法。
import {expect} from 'chai';
import 'mocha';
class Bar {
private val: number;
constructor(val: number) {
this.val = val;
}
isValid(): boolean {
return this.val !== 2;
}
canMergeWith(bar: Bar): boolean {
return this.val === bar.val;
}
}
class BarBuilder {
constructor() {
}
createBars(payload: number[]): Bar[] {
const bars: Bar[] = [];
payload.forEach(p => {
bars.push(new Bar(p));
});
const filtered = this.filterBars(bars);
const merged = this.mergeBars(filtered);
return merged;
}
private filterBars(bars: Bar[]): Bar[] { …Run Code Online (Sandbox Code Playgroud)