小编Mar*_*tao的帖子

如何让 Jest 自定义匹配器在打字稿中工作?

我经常进行单元测试,我需要比较两个矩对象。我希望我们使用 moment 的内置函数 moment.isSame(moment) 来比较它们。但是,这意味着我的断言将如下所示:

expect(moment1.isSame(moment2)).toBeTrue();

我不太喜欢这个,特别是因为失败消息的信息量会较少。因此,我想编写一个自定义的笑话匹配器“toBeSameMoment”。以下代码似乎至少可以编译:

import moment from "moment";

declare global {
  namespace jest {
    interface MomentMatchers extends Matchers<moment.Moment> {
      toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
    }
  }
}

expect.extend({
  toBeSameMoment(received: moment.Moment, expected: moment.Moment): jest.CustomMatcherResult {
    const pass: boolean = received.isSame(expected);
    const message: () => string = () => pass ? "" : `Received moment (${received.toISOString()}) is not the same as expected (${expected.toISOString()})`;

    return {
      message,
      pass,
    };
  },
});
Run Code Online (Sandbox Code Playgroud)

但是,我无法真正让它在我的单元测试中工作......当我尝试以下测试代码时:

import moment from "moment";
import "../jest-matchers/moment";

describe("Moment matcher", …
Run Code Online (Sandbox Code Playgroud)

matcher momentjs typescript jestjs ts-jest

19
推荐指数
1
解决办法
7008
查看次数

动态Linq查询 - 如何构建select子句?

我正在尝试使用Dynamic Linq进行一些测试,但是对它不熟悉,我遇到了麻烦.

目前我有一个DataTable对象,我已经通过SQL查询填充到数据库.现在我想在这个DataTable上执行动态linq查询.这可能看起来不合逻辑,但我的最终目标是能够在由两个不同数据库填充的两个不同的DataTable上执行连接,所以考虑到这一点,我希望它更有意义.在我继续解决这个主要问题之前,我正在尝试理解一个更简单的情况并进行一些实验.

问题一是我不完全确定IQueryable(Of T)和IEnumerable(Of T)之间的选择.我理解的方式是,如果你在内存中做所有事情,你选择IEnumerable.我认为那适合我的情况,对吗?但是,当我看到更改IQuerbyable中的IEnumerable时(在下面的代码片段中),我惊讶地发现"x.Item(Fieldname)"不起作用!?我错过了什么?它给出的错误是:"后期绑定操作无法转换为表达式树".

无论如何,让我们来看看.我已经有部分工作了:

    Dim desc As String = "Description"
    Dim status As String = "Status"

    Dim query As IEnumerable(Of DataRow) = From x In tab.AsEnumerable()
    query = query.Where(Function(x As Object) x.Item(status) < 100)

    For Each row As DataRow In query.ToList()
    'Do something
    Next row
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.我使用了两个字符串变量,因为最后我想动态决定采用哪个字段.所以,"x!描述"不适合我.但是,现在我想在查询中添加一个投影,即选择一些列.我的期望是这应该是这样的:

query = query.Select(Of String)(Function(x As Object) x.Item(desc))
Run Code Online (Sandbox Code Playgroud)

(注意:我使用Select(Of String),因为这个特定的列具有类型.这当然也应该动态填充)

但是,在InvalidCastException运行时期间失败:"无法转换类型为'WhereSelectEnumerableIterator 2[System.Data.DataRow,System.String]' to type 'System.Collections.Generic.IEnumerable1 [System.Data.DataRow]'的对象." 我真的不明白这里发生了什么; 我猜错了,因为我想返回DataRow,但目前只选择一个字段,恰好是一个字符串.谁能解释/帮助我?

提前致谢!

好的,编辑,因为我应该从头开始提供更多信息:我可以有一个可变数量的where-或select-clauses.我的想法是我可以通过循环包含此信息的列表来动态添加这些.所以我认为我需要IEnumerable提供的.Where()和.Select()函数.

linq vb.net dynamic vb.net-2010

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

选项严格和匿名类型不一起?

我有一个产生匿名类型的Linq查询.但是,现在我想使用这个匿名类型的参数,它似乎不起作用.

For Each obj As Object in Query
Dim row As DataRow = obj.parameter
...
Next obj
Run Code Online (Sandbox Code Playgroud)

现在编译器在表达式obj.parameter上抛出一个错误:"Option Strict On禁止后期绑定".如果我理解正确,编译器不知道匿名类型的参数.我尝试了基于Google搜索结果的Option Infer On(并删除了As Object),但它没有帮助.这似乎有道理,因为它似乎总是向我扩展.

无论如何要解决这个问题,还是应该创建一个自定义类型?

linq vb.net anonymous-types

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

如何调试await语句?

我最近看到了关于TPL和异步模式的一些演示,所以我开始了一个小宠物项目来尝试一些东西.(异步和并行的东西)

我注意到SqlConnection有一个OpenAsync()方法,所以我想尝试等待这个.据我所知,await关键字告诉compliler检查操作是否完成,如果不是,它会将其余代码转换为continuation任务.我也明白我仍然可以调试代码.但是,我遇到了一些问题.

我写了以下简单的测试代码:

Async Sub Gogo()
    Try
        Await connection1.OpenAsync()
    Catch ex As Exception
        Console.WriteLine(ex)
    End Try
    SomeCode()
End Sub
Run Code Online (Sandbox Code Playgroud)

当我运行此代码(控制台应用程序)时会发生什么我确实得到了await语句,但没有进一步.我尝试在catch语句和try块后面的代码中设置断点.两者都没有到达,控制台应用程序只是退出.我不明白这里发生了什么.

我正在使用VS2012更新1,(VB).Net 4.5.此外,因为我怀疑发生了一些错误(这似乎没有任何意义,因为代码在我使其同步时工作)我配置了app.config来升级未观察到的异常:

<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>      
Run Code Online (Sandbox Code Playgroud)

但是,到目前为止我没有得到任何例外.我错过了什么?请帮忙 :)

vb.net async-await

4
推荐指数
1
解决办法
282
查看次数