我经常进行单元测试,我需要比较两个矩对象。我希望我们使用 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) 我正在尝试使用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查询.但是,现在我想使用这个匿名类型的参数,它似乎不起作用.
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),但它没有帮助.这似乎有道理,因为它似乎总是向我扩展.
无论如何要解决这个问题,还是应该创建一个自定义类型?
我最近看到了关于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 ×3
linq ×2
async-await ×1
dynamic ×1
jestjs ×1
matcher ×1
momentjs ×1
ts-jest ×1
typescript ×1
vb.net-2010 ×1