小编rea*_*art的帖子

如何在使用 NUnit 或 XUnit 时将参数传递给 dotnet test 命令

我正在使用 C# 和 .NET Core、Selenium 和 NUnit 开发一些端到端测试。现在我想写一个登录测试用例。我的测试是通过使用dotnet test命令从控制台启动的。

我只是想将用户名和密码传递给这个命令并在我的测试中获取它们。我不能使用 NUnit-Console,因为它目前不支持 .NET Core

解决此问题的建议方法是什么?我宁愿不将设置存储在文件中,而是直接将它们输入到控制台中。

c# testing selenium nunit xunit

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

复制内存中的SQLite数据库以更快地进行单元测试

在C#/ nHibernate项目中,我使用SQLite对我的代码进行单元测试,大致使用此处描述的方法:http://ayende.com/blog/3983/nhibernate-unit-testing.

但是,我发现构建和配置内存数据库通常需要大约150ms.我有很多单元测试,所以这很快就会增加.

我想构建和配置数据库一次,将其存储在静态变量中,并在每次单元测试需要数据库时复制它.

如何备份内存数据库?

我首先尝试创建一个命名的内存数据库.根据https://www.sqlite.org/inmemorydb.html,这是可能的.我曾经有过:

    private const string ConnectionString = "Data Source=:memory:;Version=3;";
Run Code Online (Sandbox Code Playgroud)

我试过的连接字符串是:

    private const string ConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";
    private const string ConnectionString2 = "FullUri=file:memorydb2.db?mode=memory&cache=shared";
Run Code Online (Sandbox Code Playgroud)

所以现在我只需要找出如何快速将内容从一个复制到另一个?我差不多了:我可以创建两个内存数据库,并调用"BackupDatabase"来复制数据库.

然而,单元测试的行为类似于"实例"数据库没有表,甚至"原型"数据库也没有.

        private static ISessionFactory _prototypeSessionFactory;
        private const string InstanceConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";

        private const string PrototypeConnectionString = "FullUri=file:memorydb2.db?mode=memory&cache=shared";
        private SQLiteConnection _instanceConnection;
        private ISessionFactory _instanceSessionFactory;

        public DatabaseScope(Assembly assembly)
        {
            var prototyeConfiguration = SQLiteConfiguration.Standard.ConnectionString(PrototypeConnectionString);
            var cfg = Fluently
                .Configure()
                .Database(prototyeConfiguration)
                .Mappings(m => m.HbmMappings.AddFromAssembly(assembly));
            cfg.ExposeConfiguration(BuildSchema);
            _prototypeSessionFactory = cfg.BuildSessionFactory();

            var instanceConfiguration = …
Run Code Online (Sandbox Code Playgroud)

c# sqlite nhibernate unit-testing

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

如何使用CultureInfo格式化已弃用的货币?

在dotnet中,以文化特定方式格式化货币的推荐方法是(据我所知):

using System.Globalization
var info = CultureInfo.GetCultureInfo("en-GB")
return string.Format(info, "{0:c}", 1234.5678)
Run Code Online (Sandbox Code Playgroud)

返回:

 £1,234.57
Run Code Online (Sandbox Code Playgroud)

然而.此处未给出具体货币.因此,如果英国转换为欧元,同样的方法会突然返回如下:

 € 1,234.57
Run Code Online (Sandbox Code Playgroud)

这恰好发生在拉脱维亚.今年,它转换为欧元.各种系统包含letvia lats和euros两种金额.我需要能够打印和格式化旧货币.我需要确保新货币也可以处理.此格式不仅与符号有关,还与放置(前后,有或没有空格)和本地数字格式(小数分隔符和千位分隔符)有关.

我们数据库中的每个金额都有货币(例如EUR)和相应的文化(例如nl-NL).欧元金额的格式不同,具体取决于它们来自我们的德国或荷兰办事处.(他们都使用欧元,但格式不同)

  • dotnet是否提供对旧货币的访问?
  • 什么是编写格式量的未来证明方式?

现在,我能想到的唯一方法是将culture-database复制到我的数据库.

c# format currency cultureinfo

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

Elvis运算符(Nullsave解引用运算符)是否导致空引用异常?

在包含elvis运算符(即nullsafe解引用运算符;?.)的表达式上调用扩展方法时,结果null不会按预期传递给扩展方法.实质上,它可能会导致意外的空引用异常.这是一个展示这个的程序:

class Program
{
    static void Main(string[] args)
    {
        string nil = null;
        foreach (var c in ((nil?.ToCharArray()).EmptyIfDefault())) { }; // works
        foreach (var c in (nil?.ToCharArray().EmptyIfDefault())) { }; // nullref
    }
}

public static class Utility
{
    public static char[] EmptyIfDefault(this char[] target)
    {
        return target ?? new char[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这种行为是设计的吗?注意没有?ToCharArray()和EmptyIfDefault之间.如果有,我会理解当前的行为.现在,它似乎是一个错误.(将此报告给Microsoft的正确方法是什么?)

对于那些看到相同行为的人:额外的大括号似乎阻止了它.

(顺便说一句:这是我正在使用的实际EmptyIfNull :)

    public static IEnumerable<TTarget> EmptyIfNull<TTarget>(this IEnumerable<TTarget> target)
    {
        return target ?? Enumerable.Empty<TTarget>();
    }
Run Code Online (Sandbox Code Playgroud)

编辑我只是将下面给出的答案包含在我的问题中:

这与一个常见的陷阱有关:

var txt = "I am " +
    age>=18 ? …
Run Code Online (Sandbox Code Playgroud)

c# null operators null-coalescing-operator dereference

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

在 System.Xml.XPath 中启用 XPath2 查询(XPathException: invalid token)

Microsoft 的 System.Xml.XPath nuget-package 可用于 .NET 4.6,声称支持 XPath 1.0 和 2.0。De文档说描述了命名空间:

System.Xml.XPath 命名空间包含定义游标模型的类,用于作为 XQuery 1.0 和 XPath 2.0 数据模型的实例导航和编辑 XML 信息项。

在升级 Visual Studio、升级和我所有的项目到框架版本 4.6 之后,我仍然无法让最简单的 XPath-2.0 for-expression 工作。根据规范,它们应该可以工作。

我无法想象微软声称支持它实际上不支持的东西,所以显然我做错了。如何正确使用 XPath2 查询?

[TestMethod]
public void TestXPath2()
{
    // The System.Xml.XPath namespace contains the classes that define a cursor model for navigating and editing XML information items as instances of the 
    // XQuery 1.0 and XPath 2.0 Data Model.

    var expression = "for $x in /Root/Foo/Bar …
Run Code Online (Sandbox Code Playgroud)

.net c# xml xpath xpath-2.0

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

在 Azure DevOps 中允许“删除分支”而不允许“重写历史记录”

如果我尝试从 Azure DevOps GIT 存储库中删除分支,则需要强制推送权限,根据显示的错误消息:

无法删除某些陈旧分支名称。 删除大括号需要强制推送权限。

然而,允许“强制推送”也允许重写历史。这甚至在配置这些权限的地方明确说明。

强制推送(重写历史记录、删除分支和标签)- 未设置

在我对 Git 的理解中,分支只不过是更改的书签/快捷方式。在某种程度上,它们是一种特殊的标签。如果这些在合并期间被丢弃,则不需要强制右推。

我想授权人们能够删除分支,而不赋予他们扰乱历史的权利。他们不应该能够编辑/删除实际的更改集,但他们可以对这些特殊类型的标签执行所有操作。我该如何配置呢?

或者我是否误解了通过允许强制推送可以重写的历史量?我想要保留的只是谁签入了哪些代码更改。允许武力推动可以打破这段历史吗?

git version-control git-push azure-devops

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