我正在使用 C# 和 .NET Core、Selenium 和 NUnit 开发一些端到端测试。现在我想写一个登录测试用例。我的测试是通过使用dotnet test命令从控制台启动的。
我只是想将用户名和密码传递给这个命令并在我的测试中获取它们。我不能使用 NUnit-Console,因为它目前不支持 .NET Core。
解决此问题的建议方法是什么?我宁愿不将设置存储在文件中,而是直接将它们输入到控制台中。
在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) 在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).欧元金额的格式不同,具体取决于它们来自我们的德国或荷兰办事处.(他们都使用欧元,但格式不同)
现在,我能想到的唯一方法是将culture-database复制到我的数据库.
在包含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) 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) 如果我尝试从 Azure DevOps GIT 存储库中删除分支,则需要强制推送权限,根据显示的错误消息:
然而,允许“强制推送”也允许重写历史。这甚至在配置这些权限的地方明确说明。
在我对 Git 的理解中,分支只不过是更改的书签/快捷方式。在某种程度上,它们是一种特殊的标签。如果这些在合并期间被丢弃,则不需要强制右推。
我想授权人们能够删除分支,而不赋予他们扰乱历史的权利。他们不应该能够编辑/删除实际的更改集,但他们可以对这些特殊类型的标签执行所有操作。我该如何配置呢?
或者我是否误解了通过允许强制推送可以重写的历史量?我想要保留的只是谁签入了哪些代码更改。允许武力推动可以打破这段历史吗?
c# ×5
.net ×1
azure-devops ×1
cultureinfo ×1
currency ×1
dereference ×1
format ×1
git ×1
git-push ×1
nhibernate ×1
null ×1
nunit ×1
operators ×1
selenium ×1
sqlite ×1
testing ×1
unit-testing ×1
xml ×1
xpath ×1
xpath-2.0 ×1
xunit ×1