小编Mat*_*sca的帖子

XUnit,AutoFixture和Moq最佳实践

我正在阅读大量文档和示例,了解如何正确地对标题中的三个组件进行单元测试.我想出了一种针对我的业务逻辑的方法的测试方法,但它感觉非常笨重和肮脏.

我想从那些对这个主题更有经验的人那里得到一些反馈,看看我如何改进它.

这是代码,解释如下:

[Fact]
public void ShouldGetItemWithSameId()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var facade = fixture.Freeze<Mock<IDataFacade>>();
    facade.Setup(c => c.Get(It.IsAny<int>())).Returns((int i) => new Item { Key = i });

    var sut = fixture.Create<BusinessLogic>();
    var expected = fixture.Create<int>();

    Assert.Equal(expected, sut.Get(expected).Key);
}
Run Code Online (Sandbox Code Playgroud)

我的BusinessLogic类使用一个IDataFacade构造函数参数,该参数负责在其Get(int)方法中检索具有相同Id的项目,非常基本的东西.

我冻结了IDataFacade模拟并将其设置为构造一个与Id匹配的对象It.IsAny<int>.然后我创建我的SUT并测试它.工作良好.

我想了解一下,考虑到以下方面我是否可以改进:

  • 我必须测试更复杂的方法,比如一个Query方法,它接受一个包含很多属性的类,这些属性将用作匹配被查询类型的属性的过滤器.在这种情况下,我不知道如何正确地执行模拟的"设置"部分,因为我必须初始化所有或接近所有返回类型的属性,并且在这种情况下它不是单个项目但是整个系列
  • 设置部分感觉不合适,我希望能够在更多方法中重复使用它

我有一些其他测试用Theory,AutoMoqData但我无法使用这种方法实现这个测试(我认为更复杂的测试),所以我Fact用手动实例化的夹具切换回普通.

任何帮助将非常感激.

c# unit-testing moq xunit.net autofixture

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

实体框架5的性能问题

现在我正在研究一个非常复杂的数据库.我们的对象模型旨在映射到数据库.我们将EF 5与POCO类一起使用,手动生成.

一切正常,但有些人抱怨表演.我从来没有遇到EF的性能问题,所以我想知道这次我是不是做了一件非常错误的事情,或者问题可能存在于其他地方.

主查询可以由动态参数组成.我有几个if和switch块在概念上是这样的:

if (parameter != null) { query = query.Where(c => c.Field == parameter); }
Run Code Online (Sandbox Code Playgroud)

此外,对于一些复杂的和/或组合,我正在使用来自Albahari的LinqKit扩展.

该查询针对包含数年和数年的"订单"的大表.平均使用是2个月的范围过滤器.

现在,当组成主查询时,它将使用Skip/Take组合分页,其中Take设置为10个元素.

毕竟,IQueryable通过层发送,到达使用Automapper的MVC层.

在这里,当Automapper开始迭代(因此查询确实被执行)时,它会调用一堆导航属性,这些属性有自己的导航属性等等.根据EF建议,所有内容都设置为延迟加载,以避免在包含超过3或4个不同实体的情况下急切加载.我的场景是这样的:

  • 订单(最多10个)
    • 订单下的许多导航属性
      • 其中一些还有其他导航(本地化实体)
    • 订单详情(每个订单的订单详情很多)
      • 每个订单细节下的许多导航属性
        • 其中一些还有其他导航(本地化实体)

对于单个呈现的"页面",这很容易导致总共300多个查询.这些查询中的每一个都非常快,在几毫秒内运行,但仍有两个主要问题:

  • 延迟加载的属性按顺序调用而不是并行调用,因此需要更多时间
  • 作为前一点的结果,每个查询之间存在一些死区时间,因为数据库必须接收sql,运行它,为每个查询返回等等.

只是为了看看它是怎么回事,我试着用急切的加载来制作相同的查询,正如我预测的那样,这是一场彻底的灾难,翻译的sql超过7K行(是的,七千)并且总体上更慢.

现在我不愿意认为EF和Linq不是这种情况的正确选择.有人说,如果他们要编写一个存储过程来获取所有需要的数据,那么它的运行速度将提高数十倍.我不相信这是真的,我们将失去所有相关实体的自动实现.

我想到了一些我可以做些改进的事情,比如:

  • 表拆分以减少选定的列
  • 关闭对象跟踪,因为此方案是只读的(具有未跟踪的实体)

尽管如此,主要的抱怨是结果页面(在MVC 4中完成)渲染速度太慢,经过一些诊断后,它似乎都是"服务器时间"而不是"网络时间",大概是从8到12服务器时间秒.

根据我的经验,这不应该发生.我想知道我是否以错误的方式接近这个查询需求,或者我是否必须将注意力转向别的东西(可能是一个配置不好的IIS服务器,或者其他任何我真的无能为力).有人说,数据库的索引还可以,我们的dba非常仔细地检查.

因此,如果有人有任何提示,建议,最佳实践,我对此缺失,或者只是可以告诉我,在这种情况下使用EF与延迟加载我是错误的...你们都欢迎.

c# sql asp.net-mvc performance entity-framework

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

从C#调用Web服务并发送未转义的xml

我正在尝试将应用程序与第三方Web服务集成.我必须调用的方法的签名是这样的(由VS代理生成器生成):

string MyFoo(string param1, string param2, string param3, string someXml)
Run Code Online (Sandbox Code Playgroud)

现在对于前3个参数,没有问题.根据供应商规范,第四个参数应包含"未包含在CDATA块中的非转义xml",如下所示:

<![CDATA[<?xml version="1.0" encoding="utf-8"?><rootNode></rootNode>]]>
Run Code Online (Sandbox Code Playgroud)

现在,c#escapes(正如我所希望的那样)所有必须转义的字符,主要是"<"和">"字符,即使在CDATA语句中,也会产生如下内容:

&lt;![CDATA[&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;rootNode&gt;&lt;/rootNode&gt;]]&gt;
Run Code Online (Sandbox Code Playgroud)

据我所知这是一个正确的行为,并且没有办法覆盖它,因为它可能会产生一个错误的请求(无效的肥皂消息),甚至是安全问题.

有没有人知道我是否错过了什么,不知道什么,或者这是正确的,并且第三方网络服务的期望无法得到遵守?

谢谢.

.net c# xml web-services escaping

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

实体框架 6“HasRequired”和“WithMany”部分工作 - 未按预期工作

因此,在疯狂地搜索了三个小时并在网上到处寻找之后,我强迫自己在这里问。我使用实体框架已有 5 年多了,但从未遇到过下面描述的那种问题

我有两个 POCO 类(已编辑):

public class Company
{
    public virtual ICollection<BusinessUnit> BusinessUnits { get; protected set; } = new List<BusinessUnit>();

    public int Id { get; protected set; }
}

public class BusinessUnit
{
    public virtual Company Company { get; protected set; } = new Company();

    public int CompanyId { get; protected set; }

    public string Description { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的“BusinessUnit”配置中我声明:

        this
            .HasRequired(c => c.Company)
            .WithMany(c => c.BusinessUnits)
            .HasForeignKey(c => c.CompanyId);
Run Code Online (Sandbox Code Playgroud)

以下作品:

  • 通过 DbSet 分别查询 2 …

.net c# entity-framework entity-framework-6

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

将asp.net Mvc从3降级为2

我知道这是一个相当奇怪的问题,请不要激怒我:)

我有一个具体的需要"降级"当前Asp.Net MVC 3(.NET框架4)应用到Asp.Net MVC 2(.NET框架3.5),因为我们共同的托管服务提供商不支持.NET 4.0(我知道这是疯狂的考虑自2010年4月12日开始零售以来,2009年5月首次推出测试版,但这不是帖子的重点.

是否有任何工具,指南或任何可能有助于此过程的东西?我有点迷失,因为我升级了许多应用程序,但我从来没有必要降级一个.

除了严格意义上的MVC之外,我正在使用一个带有EF Code First的数据层(也许nhibernate将是替换它的最佳工具?)

任何帮助,提示,信息,任何赞赏.

谢谢.

编辑:更改托管服务提供商不是一个选项,否则我根本不会发布这个.我个人反对这种降级 - 我发现它完全没有意义 - 但它仍然是唯一的选择.

.net c# asp.net-mvc downgrade

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

我的Visual Studio 2012旁边的行号旁边有彩色条

今天,当我在工作中启动Visual Studio 2012时,我发现了一些新的彩色条.

我们通过RDP在共享远程服务器上工作,所以我询问是否有人安装或更新了任何东西.似乎没有人做过"任何事情".

我看到的酒吧:

酒吧的截图.

最左边的酒吧,绿色和黄色,我知道.它们显示文件自打开以来的编辑位置(黄色表示更改尚未保存,绿色表示已保存).

最右边的一个,我迷失了他们.他们似乎通常镜像最左边,但并不总是.他们坚持通过文件关闭重新打开.

通过一些修补,似乎绿色矩形意味着添加了新的线条,蓝色矩形意味着修改现有线条,红色三角形意味着删除线条.

这些是Visual Studio的About窗口中的信息:

Microsoft Visual Studio Premium 2012
Version 11.0.60315.01 Update 2
Microsoft .NET Framework
Version 4.5.50709

Installed Version: Premium

LightSwitch for Visual Studio 2012   04941-004-0044006-02568
Microsoft LightSwitch for Visual Studio 2012

Office Developer Tools   04941-004-0044006-02568
Microsoft Office Developer Tools

Team Explorer for Visual Studio 2012   04941-004-0044006-02568
Microsoft Team Explorer for Visual Studio 2012

Visual Basic 2012   04941-004-0044006-02568
Microsoft Visual Basic 2012

Visual C# 2012   04941-004-0044006-02568
Microsoft Visual C# 2012

Visual …
Run Code Online (Sandbox Code Playgroud)

visual-studio-2010

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

C#,自定义异常的使用

我需要做一个简短的前提:我是一名拥有 20 多年经验的软件架构师,而不是一个初级的问路人。这并不是说“我什么都知道”(实际上恰恰相反),而是为了提供上下文并说明我遇到了对我认为是常识和最佳实践的事情的合理怀疑,并且已经这样做了所有这些时间。

我正在为不同的客户从事不同的项目。我总是检查方法的参数是否为空和其他无效状态。您可以在我的代码中找到的常见前提条件检查是:

if (param == null) { throw new ArgumentNullException(nameof(param)); }
Run Code Online (Sandbox Code Playgroud)

或者

this.myField = myParam ?? throw new ArgumentNullException(nameof(myParam));
Run Code Online (Sandbox Code Playgroud)

还要记住,我很少使用异常,我不使用异常进行用户输入验证,我只是使用它们来检查和/或发出代码中的无效状态,从而导致编程错误。在我的代码中找到 try/catch 块是非常罕见的。

我的一个客户刚刚问我,没有太多争论的余地,用自定义例外来代替任何类似的事件。这意味着我要定义 CustomerNameArgumentNullException、CustomerNameFileNotFoundException 等,并在我将使用标准异常的任何地方使用它们。

现在我会遵守,我无权辩论客户的请求,但是他们的首席程序员在这一点上非常强调这是正确的方法,使用默认异常会使代码可读性降低,并且自定义异常会产生更多轻松查看 Azure Application Insights 中的内容。我试图指出他拥有引发异常的方法的完全限定名称,因此他可以知道哪个程序,哪个程序集和命名空间等等,但同样,没有太多争论的余地,这不是我的地方这样做。

所以我一直在想他是否真的是对的,而且我一直都在做错误的例外。如果有人有更多的见解和/或我可以阅读的一些材料来支持这一理论。

谢谢。

.net c# exception .net-core .net-standard

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

NHibernate两列同时作为复合键和外键

首先,我在网上和这里进行了彻底搜索,没有找到明确的手头任务解决方案.如果我的搜索不够准确且这个答案已经发布,我很抱歉.

问题:我有一张桌子.此表必须在两个字段上具有主键,并且其他字段包含一些数据.作为主键的两个字段也必须是外键,每个字段位于不同的表上.像(伪代码):

Product: Id (pk)
Category: Id (pk)

ProductCategory: (ProductId (fk on product), CategoryId (fk on category))(pk), SomeOtherField1, SomeOtherField2, etc
Run Code Online (Sandbox Code Playgroud)

现在我找不到如何使用Fluent Nhibernate配置它.虽然这个任务在EF Code First上是微不足道的,但是在这个项目上我被困在Net 3.5上并且不能使用它,所以NHibernate是唯一的另一个选择.

我尝试使用CompositeId(),References()和其他东西,尝试了各种组合,但没有一个工作.我不认为我得到的错误是相关的,我只需要一个像这样的场景的示例工作配置.

任何人都知道如何使用Fluent Nhibernate(没有xml配置)映射这个?

c# nhibernate fluent-nhibernate

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

VS2012 javascript intellisense仅适用于显式调用

我正在努力使新的vs2012 javascript intellisense工作.

起初我注意到它没有工作,因为resharper intellisense已启用.我试图完全暂停resharper,我的状况更好,但仍然有问题.

我添加了_references.js文件,其中包含一些引用(jquery和angularjs).我在选项中切换到Implicit(web)设置,因此它读取_references.js文件.

我添加了一个空的js文件.Intellisense仅在我按CTRL + SPACE(对于方法和类型列表)或CTRL + SHIFT + SPACE(对于方法参数列表)时出现,但在我开始键入时不出现,也不在我键入点或打开圆括号时出现.

我真的不知道这是什么问题.Resharper不在路上所以一切都应该工作.

该版本为Vs2012 premium 11.0.50727.1 RTMREL.

其他扩展安装:

  • Web开发人员工具(我也在另一台计算机上的Web开发人员快速版本上,并在该安装intellisense工作正常)
  • Web Essentials 2012(已禁用)
  • 适用于Javascript的Windows库的Visual Studio Extensions(我无法禁用或卸载)
  • Git源代码控制提供程序(我几乎认为可能无关)
  • 视觉工作室2012的xUnit.net亚军(再次,几乎没有关联)

谢谢.

javascript resharper intellisense visual-studio-2012

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

Angular 6 - rxjs管道不能处理valueChanges

我有一个反应形式,带有文本输入.为了便于访问我的打字稿,我声明:

get parentId(): FormControl {
    return this.addForm.get("parentId") as FormControl;
}
Run Code Online (Sandbox Code Playgroud)

这部分工作,控件被正确访问.

现在我的ngOnInit如果我这样做:

this.parentId.valueChanges.subscribe(() => console.log("Changed"));
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,在输入中更改的每个字符处执行控制台日志.但如果我这样做:

this.parentId.valueChanges.pipe(tap(() => console.log("Changed")));
Run Code Online (Sandbox Code Playgroud)

什么都没发生.没有错误,没有任何错误.我也尝试过使用map,switchMap等等.似乎管道对valueChanges不起作用.我在我的代码中的其他地方使用管道方法在不同的observables上没有任何问题.

我需要在这里使用管道去抖动,映射等.

知道我做错了什么吗?

- 编辑 -

这是Angular Material网站上的自动填充组件的代码示例:

ngOnInit() {
   this.filteredOptions = this.myControl.valueChanges
       .pipe(
          startWith(''),
          map(val => this.filter(val))
       );
}
Run Code Online (Sandbox Code Playgroud)

最后没有订阅,示例有效.

observable rxjs angular angular6

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

.Net 3.5支持中型信任和POCO的ORM

场景:我遇到了一个以中等信任方式运行的共享托管服务提供商,并且拥有.Net framework 3.5

我使用Nhibernate为我的网站构建了一个数据层,但却发现它无法在中等信任上运行.

我在互联网上找到了一些指南来解释下载Castle.Core和NHibernate来源并重建它们允许部分信任,但我遇到了各种问题(所有来源都更新到.net 4.0,虽然我知道我可以浏览旧提交的git repos,好像在大海捞针找到了我.)

我现在需要的是一个支持中等信任和POCO的ORM(因此,它们与T4生成的类紧密耦合,因此排除了EF 1.0和Linq到Sql).

我也从使用Lightspeed ORM的高级地方获得了"NO",因为免费版本限制为8个表,并且架构可能会增长.

我知道我问了很多,但是如果有人知道已经构建的Nhibernate for 3.5版本可以以中等信任或有效的替代方式运行,我会非常高兴.

谢谢.

c# nhibernate orm medium-trust

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

knockoutjs afterAdd和afterRender问题

我正在使用一个简单的模板,其中包含{{each}}块.每次在集合中发生变化时,整个模板都会被重新渲染.

然后我在模板绑定中附加了一个afterRender事件.调用的函数只是将焦点设置为新添加的输入元素.工作完美.

{{each Fabbricati}}
<li>
    <div style="float: left; clear: left;">
        {{if Editing}}
        <input id="editingitem" type="text" data-bind="value: Name, event: { blur: function() { Editing(false) }, keypress: function(event) { if (event.which == 13) { blur() } return true; } }" />
        {{else}}
        <span data-bind="click: function() { Editing(true) }">${Name() || 'Senza nome'}</span>
        {{/if}}
        - <button class="fancybox edit" data-bind="click: function() { Edit(Id()) }">Modifica</button><button class="remove" data-bind="click: Remove">Rimuovi</button>
    </div>
</li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

和调用div:

<div id="wrapper" data-bind="template: { name: 'navTemplate', afterRender: Prettify </div>
Run Code Online (Sandbox Code Playgroud)

现在我尝试将{{each}}内的块移动到独立模板,并使用模板绑定中的"foreach"选项调用它.到目前为止一切都很好,但这里有一个问题:afterRender将不再适用.我的输入不会得到关注.

我已经在互联网上阅读了它的意图行为,afterAdd而是使用它,但这也不行.Prettify …

javascript mvvm knockout.js

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