我正在构建ASP.NET Core WebAPI,我正在尝试为控制器编写单元测试.我发现的大多数示例都来自较旧的WebAPI/WebAPI2平台,似乎与新的Core控制器无关.
我的控制器方法正在返回IActionResults
.但是,该IActionResult
对象只有一个ExecuteResultAsync()
需要控制器上下文的方法.我手动实例化控制器,因此此实例中的控制器上下文为null,这会在调用时导致异常ExecuteResultAsync
.从本质上讲,这是让我走上一条非常黑客的道路,让这些单元测试成功完成并且非常混乱.我想知道必须有一种更简单/更正确的API控制器测试方法.
此外,如果有所不同,我的控制器不使用async/await.
我想要实现的简单例子:
控制器方法:
[HttpGet(Name = "GetOrdersRoute")]
public IActionResult GetOrders([FromQuery]int page = 0)
{
try
{
var query = _repository.GetAll().ToList();
int totalCount = query.Count;
int totalPages = (int)Math.Ceiling((double)totalCount / pageSize) - 1;
var orders = query.Skip(pageSize * page).Take(pageSize);
return Ok(new
{
TotalCount = totalCount,
TotalPages = totalPages,
Orders = orders
});
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
[Fact]
public void GetOrders_WithOrdersInRepo_ReturnsOk()
{
// arrange
var …
Run Code Online (Sandbox Code Playgroud) 在ASP.NET Core/EntityFramework Core中,services.AddDbContext <>方法将指定的上下文添加为作用域服务.我的理解是,这是Microsoft建议的dbcontext生命周期管理.
然而,我们的工程师部门对此有很多争论,许多人认为需要尽快处理上下文.那么,将dbcontext配置为Transient仍然保持通常使用的相同Repository模式(即将上下文直接注入存储库的构造函数)以及支持灵活的单元测试的最佳方法是什么?
例如:
public string ReplaceXYZ(string text)
{
string replacedText = text;
replacedText = replacedText.Replace("X", String.Empty);
replacedText = replacedText.Replace("Y", String.Empty);
replacedText = replacedText.Replace("Z", String.Empty);
return replacedText;
}
Run Code Online (Sandbox Code Playgroud)
如果我甚至为不包含"X","Y"或"Z"的字符串调用"ReplaceXYZ",每次会创建3个新字符串吗?
我在其中一个项目中发现了与此类似的代码.它被重复调用,因为它循环遍历大量字符串.
任何人都可以举例说明如何将组件动态加载到Material MatDialog中吗?
我想要做的是:我将为MatDialog配置数据提供一个组件类型,然后该对话框将创建一个实例并放置在它的mat-dialog-content区域内.
看来我需要使用ng-template和viewContainerRef的某种组合,但我不知道如何实例化提供的组件Type并插入到所需的区域.
一个简单的例子:
<h2 mat-dialog-title>MyTitle</h2>
<mat-dialog-content>
<---- dynamically loaded component would be inserted here ---->
</mat-dialog-content>
<mat-dialog-actions>
<button mat-button mat-dialog-close>Cancel</button>
<button mat-button [mat-dialog-close]="true">Save</button>
</mat-dialog-actions>
Run Code Online (Sandbox Code Playgroud) 我正在开发一个显示多个TabItem
s 的支持工具TabControl
.每个TabItem
代表一个员工,在这些员工Tab
的每个人中都有另一个TabControl
包含额外TabItem
的员工.这些TabItem
代表该员工的Outlook文件夹(如"正在工作","已完成"等).这些文件夹中TabItem
的每一个都包含一个ListBox
绑定到与该Outlook文件夹相关ObservableCollection
的MailItem
s的文件夹.这些不是巨大的收藏 - 每个只有十几件ListBox
.虽然总的来说,所有人都TabItem
可以想到100件左右.
我目前构建应用程序的方式是应用程序启动并使用相应的员工选项卡和子选项卡填充屏幕.这个过程相当快,我很高兴.我创建了一个静态Global.System.Timer
文件,所有文件夹TabItem
的代码隐藏都与之同步.因此,应用程序每5分钟清除一次ObserverableCollection
并重新扫描Outlook文件夹.
问题是扫描过程使应用程序停止.我尝试使用a BackgroundWorker
从Outlook收集邮件作为后台进程,然后将一个List<MailItem>
对象传递给一个RunWorkerCompleted
方法,然后运行一个this.Dispatcher.BeginInvoke
清除相应的进程,ObservableCollection
然后将项目从List<MailItem>
后面添加到ObservableCollection
.我甚Dispatcher
至将此设置为较低优先级.
尽管如此,在扫描/填充ListBox
过程中应用程序非常笨重.我不清楚如何更好地设计这个,我承认我对此有些新意.我意识到清除每个ObservableCollection
s都是低效的,但Outlook文件夹更改事件并不是特别可靠,所以我需要每隔一段时间重新扫描一次以确保所有MailItem
s都被表示.
下面是我的WPF控件的代码,其中包含ListBox
.请记住,这些ListBox
控件中大约有10个同时处于活动状态.
// This entire UserControl is essentially a ListBox control
public partial class TicketListView : …
Run Code Online (Sandbox Code Playgroud) 这是一个场景:我最近的任务是为我们现有的应用程序编写一个rs232串行设备通信接口.此应用程序具有基本类来进行实际通信.基本上我所做的就是接受一个字节数组进入我的类然后处理它.
部分问题是,一次传递的字节数组不能超过1000个字节,但可能有更多数据等待进入该事务.所以我不知道交付给我的是完整的.我正在做的是将1000字节数组转换为字符串并将其填充到缓冲区中.然后,此缓冲区运行正则表达式以查看添加的内容是否创建完整的事务.我知道如果它匹配特定的签名(在开头和结尾基本上是一系列控制代码),它就完整了.如果在垃圾数据进入并且无法匹配的情况下没有找到匹配,则此缓冲区将仅在放弃之前附加数据最多3次.这不是一个高数据量的设备,所以我不希望大量的数据不断涌入.并且正则表达式最多只能执行3000个字符.
到目前为止它工作得很好,但我的问题是正则表达式可怕吗?对于我正在使用它们的性能,是否有任何后果?我的理解是正则表达式通常对大量数据不好,但我觉得这很小.
我正在尝试在我的组件中对基于模板的表单进行单元测试。该表格很简单,包含一个人的联系信息。我想做的是对各种验证场景进行单元测试。我认为我能做的就是简单地设置一个值,例如电子邮件地址,然后检查 ngForm 对象,获取 emailAddress 的相应 formControl,然后检查有效性状态。然而,我发现该表单虽然存在,但根本不包含任何控件。所以看来这个形式从来没有完全建成。
代码(为了简洁起见,我省略了导入和一些提供程序语句等):
人员详细信息-联系信息.component.html
<custom-input type="text"
name="emailAddress"
[(ngModel)]="model.emailAddress"
maxlength="255"
pattern="^[^\s@]+@[^\s@]+\.[^\s@]{2,}$"
#emailAddress="ngModel">
</custom-input>
<custom-input type="text"
[disabled]="permissions.canViewOnly"
name="phone"
[(ngModel)]="model.phone"
maxlength="16">
</custom-input>
<custom-input type="text"
[disabled]="permissions.canViewOnly"
name="model.fax"
[(ngModel)]="fax"
maxlength="16">
</custom-input>
Run Code Online (Sandbox Code Playgroud)
人员详细信息-contact-info.component.ts
@Component({
selector: 'person-details-contact-info',
templateUrl: 'person-details-contact-info.component.html',
viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]
})
export class PersonDetailsContactInfoComponent {
@Input('model')
model: {
emailAddress: '',
phone: '',
fax: ''
}
}
Run Code Online (Sandbox Code Playgroud)
** 单元测试代码 **
@Component({
template: `
<form #form="ngForm">
<person-details-contact-info [(model)]="model">
</person-details-contact-info>
</form>
`,
providers: [ ]
})
export class …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何做到这一点,人们会认为这很简单。
我有一个MenuItem
是a的一部分ContextMenu
。我binding
在视图模型上有一个布尔属性。根据此属性的状态,我希望MenuItem
更改 的标题文本和图标。
我当然可以IValueConverter
为此使用 an ,但我确信使用 aDataTemplate
和触发器有更优雅的解决方案。我只是想不出正确的标记。
我编写的代码(在下面剪下)有两个问题:一个HeaderTemplate
似乎不包含图标,所以MenuItems
's 的文本也包含图标(通常图标出现在左侧部分 - 参见图片并与复制和清除菜单项进行比较)。此外,单击MenuItem
不会触发DataTemplate
更改(注意该命令有效,viewmodel 绑定实际上会切换真/假状态)。
<ContextMenu>
<MenuItem Command="{Binding Source={x:Static cmd:Commands.PauseCommand}}"
CommandParameter="{Binding}">
<MenuItem.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image x:Name="img" Source="../Icons/pause.png"/>
<TextBlock x:Name="txt" Text="Pause"/>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsPaused}" Value="True" >
<Setter Property="Image.Source" Value="../Icons/play.png" TargetName="img"/>
<Setter Property="Text" Value="Play" TargetName="txt"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</MenuItem.HeaderTemplate>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)
c# ×5
angular ×2
asp.net-core ×2
unit-testing ×2
wpf ×2
.net-core ×1
datatemplate ×1
datatrigger ×1
dispatcher ×1
forms ×1
immutability ×1
menuitem ×1
regex ×1
string ×1