相关疑难解决方法(0)

什么是对象模拟,什么时候需要它?

许多人在编写单元测试时都使用模拟对象.什么是模拟对象?我为什么需要一个?我需要一个模拟对象框架吗?

testing mocking

43
推荐指数
6
解决办法
9468
查看次数

如何对WCF服务进行单元测试?

我们有一大堆DLL,可以让我们访问我们的数据库和其他应用程序和服务.

我们已经使用瘦客户端然后使用的瘦WCF服务层包装这些DLL.

我对如何编写仅测试WCF服务层的单元测试有点不确定.我应该只编写DLL的单元测试,以及WCF服务的集成测试吗?我很欣赏任何智慧......我知道如果我的单元测试实际上进入数据库,它们实际上并不是真正的单元测试.我也明白我不需要在单元测试中测试WCF服务主机.

所以,我对确切测试的内容和方式感到困惑.

wcf unit-testing

18
推荐指数
3
解决办法
1万
查看次数

模拟或真正的课程?

使用其他类(作为成员或作为方法的参数)的类需要具有适合单元测试的实例.如果你有这些类可用并且没有引入其他依赖项,那么使用真实的东西而不是模拟更好吗?

unit-testing mocking

12
推荐指数
3
解决办法
1172
查看次数

Moq-不可覆盖的成员不得在设置/验证表达式中使用

我是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具体课程吗?只能模拟接口吗?请协助。 …

c# moq

9
推荐指数
4
解决办法
7718
查看次数

我应该在单元测试时模拟所有依赖项吗?

我的班级有依赖,我在单元测试中嘲笑.我在一个对我没有多大意义的地方得到了一个空引用异常.

我刚才意识到这是因为我没有设置我的模拟依赖.此依赖项已经过测试,但它不会连接到文件系统或数据源之类的任何内容.

我只想在这个新类中测试我的新代码,但我想在这种情况下最好不要去模拟.

这个结论是否正确?

unit-testing mocking

8
推荐指数
2
解决办法
4366
查看次数

破坏单元测试的语义

我正在为我们的主要产品编写单元测试,并且有一个问题:如何区分

  • 测试失败,因为他们测试的是错误的(发现了一个错误,例如它的非回归测试)
  • 测试失败,因为测试的另一个意外部分失败(因为测试错误或出现未知错误)

对于第一个,我们肯定有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的事实.做这个的最好方式是什么?

  • 捕获由a或b和Assert.fail抛出的MyException,但是a和b未经过此测试的测试,因此对我来说,它们在失败时不应被标记为测试失败.也许他们以后失败了,因为此时我们应该做b(); a()而不是a(); b();.
  • 让testC抛出MyException,以便测试将以"MyException"失败,但这是误导性的,因为MyException不会告诉测试写错了.然后所有测试都将失败,每个测试都有自己的异常.在这种情况下,如果forC为null,我也需要抛出类似NullPointerException的东西,它也没有语义.
  • 捕获并将由a和b抛出的MyException包装成异常,告知测试可能是错误的,如TestCorruptedException.但我无法在jUnit中找到这样的异常,因此jUnit不会识别它们(这对我来说没问题).此外,我需要从我的所有单元测试中了解这个异常,当然这些单元测试分为多个模块,项目等等......所以这是可行的但是增加了依赖性.

你对这个问题的解决方案是什么?我可能会选择第二个,但我对它不满意,如上所述.

java junit unit-testing

3
推荐指数
1
解决办法
190
查看次数

我应该模拟单元测试中的每个依赖项吗?

经过大量阅读后,我发现人们建议在单元测试下模拟方法中的每个依赖项。

单元测试时我应该模拟所有依赖项吗?

我什么时候应该嘲笑?

但是,我有一个方法可以创建对象列表(依赖项)并使用这些对象的方法来更改列表。在现实场景中,该方法是将客户端发送的数据有效负载转换为这些对象。下面是 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)

language-agnostic oop unit-testing

3
推荐指数
1
解决办法
1864
查看次数

标签 统计

unit-testing ×5

mocking ×3

c# ×1

java ×1

junit ×1

language-agnostic ×1

moq ×1

oop ×1

testing ×1

wcf ×1