我是狂热的TDD和BDD粉丝,但在UI测试方面做得不多.我有一个ASP.NET MVC 3应用程序与许多MSpec测试,我想使用WatiN添加演示文稿测试.
你测试什么样的东西?我是否必须为UI的初始加载编写测试,或仅针对因用户交互而更改的内容?
简而言之,在编写WatiN(和一般的UI测试)测试时,有什么好的经验法则和最佳实践?
我正在使用jquery自动完成功能,但在文本框中加载自动完成功能很少
我的模型如下:
Users = new List<string>();
foreach (var item in User.LoadSortedByName())
{
Users.Add(item.Name+"\n");
}
Run Code Online (Sandbox Code Playgroud)
视图:
<p>@Html.TextBox("user", "")
$(function () {
$("input#user").autocomplete('@Model.Users');
});
Run Code Online (Sandbox Code Playgroud)
更新 - 简化的尝试,但仍然没有工作
_布局
<script src="@Url.Content("~/Scripts/jquery.autocomplete.js")" type="text/javascript"></script>
View
<p><input type="text" id="tags" /></p>
<script type="text/javascript">
$(function () {
var availableTags = [
"ActionScript",
"AppleScript",
"Asp",
"BASIC",
"C",
"C++",
"Clojure",
"COBOL",
"ColdFusion",
"Erlang",
"Fortran",
"Groovy",
"Haskell",
"Java",
"JavaScript",
"Lisp",
"Perl",
"PHP",
"Python",
"Ruby",
"Scala",
"Scheme"
];
$( "#tags" ).autocomplete({
source: availableTags
});
});
Run Code Online (Sandbox Code Playgroud) 我被要求保留一些不像遗产一样的代码,并且它充满了编译器指令,使它几乎不可读,几乎可维护.例证:
#if CONDITION_1
protected override void BeforeAdd(LogEntity entity)
#else
protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
{
#if CONDITON_1
entity.DateTimeInsert = DateTime.Now;
#else
((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
base.BeforeAdd(entity);
}
Run Code Online (Sandbox Code Playgroud)
using 指令甚至更漂亮:
#if CONDITION_1
using CompanyName.Configuration;
#endif
#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif
Run Code Online (Sandbox Code Playgroud)
我以为我会ConditionalAttribute放手一搏,但在这种情况下这不会奏效
有什么方法可以解决这个编译器指令的噩梦吗?
代码是针对编译的.NET 3.5.
更新:
Oded回答建议删除BeforeAdd方法周围的编译器指令,从而使其重载.不幸的是,这两个方法都不会起作用,因为两个方法都应该覆盖一个AbstractBusiness类,它提供两种不同的实现,具体取决于最终包含哪些程序集:
protected virtual void BeforeAdd(TEntity entity) {}
Run Code Online (Sandbox Code Playgroud)
要么
protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}
Run Code Online (Sandbox Code Playgroud)
此代码从过去一段时间创建的一组库中获取其依赖关系,并且从那时起一直在"升级".他们现在有4个不同版本的库,其中包含冲突的命名空间和不同的实现.所有这些都与使用(非常)旧版本的应用程序的"向后兼容性"有关.
我最终选择了@Oded的答案,因为它作为一种通用方法最有意义( …
我有一个使用的表单 Ajax.BeginForm()
<% using (Ajax.BeginForm("UpdateCompanyShop", "CompanyShop", FormMethod.Post,
new AjaxOptions { OnSuccess = "updateList", OnFailure = "onError",
UpdateTargetId="slist", LoadingElementId = "loading" }))
Run Code Online (Sandbox Code Playgroud)
控制器动作代码如下:
if(string.IsNullOrEmpty(company.Address))
return new HttpStatusCodeResult(418, "Please fill in address");
else if (company.DistrictID < 0)
return new HttpStatusCodeResult(418, "Please select district");
else
return new HttpStatusCodeResult(418, "Error saving data");
Run Code Online (Sandbox Code Playgroud)
我在AjaxOptions中使用了OnFailure ="onError",我有这样的客户端脚本
function onError(response, status, error) {
var statusDescription = ***something***;
alert(statusDescription);
}
Run Code Online (Sandbox Code Playgroud)
我在JavaScript中使用调试器但是找不到StatusDescription(第二个参数HttpStatusCodeResult)
知道如何获得状态描述吗?或者我根本不应该使用HttpStatusCodeResult?在AJAX提交中返回错误(除了验证)的正确方法是什么?
我正在编写 ASP.NET Core 1 应用程序,它有一个 Web API 控制器,供应商将在其中发布数据。
这是 Model 类的简化版本,我会将传入数据绑定到该类:
public class Lead
{
public int SupplierId { get; set; }
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是日期将以德语格式发布,例如30.09.2016. 我不想将应用程序的全球文化设置为,de-DE因为 a) 我不是德国人,并且 b) 应用程序的其余部分将使用 ISO 日期。
我已经准备好编写一个自定义的IModelBinder,因为它在 ASP.NET Core MVC 中显然是强制性的,一个IModelBinderProvider.
这是我的实现IModelBinderProvider:
public class GermanDateTimeModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (!context.Metadata.IsComplexType &&
context.Metadata.ModelType == typeof(DateTime))
return new …Run Code Online (Sandbox Code Playgroud) c# model-binding custom-model-binder asp.net-core-mvc asp.net-core-webapi
我有两个非常相似的规范,用于两个非常相似的控制器动作:VoteUp(int id)和VoteDown(int id).这些方法允许用户向上或向下投票; 有点像StackOverflow问题的投票上/下功能.规格是:
VoteDown:
[Subject(typeof(SomeController))]
public class When_user_clicks_the_vote_down_button_on_a_post : SomeControllerContext
{
Establish context = () =>
{
post = PostFakes.VanillaPost();
post.Votes = 10;
session.Setup(s => s.Single(Moq.It.IsAny<Expression<Func<Post, bool>>>())).Returns(post);
session.Setup(s => s.CommitChanges());
};
Because of = () => result = controller.VoteDown(1);
It should_decrement_the_votes_of_the_post_by_1 = () => suggestion.Votes.ShouldEqual(9);
It should_not_let_the_user_vote_more_than_once;
}
Run Code Online (Sandbox Code Playgroud)
VoteUp:
[Subject(typeof(SomeController))]
public class When_user_clicks_the_vote_down_button_on_a_post : SomeControllerContext
{
Establish context = () =>
{
post = PostFakes.VanillaPost();
post.Votes = 0;
session.Setup(s => s.Single(Moq.It.IsAny<Expression<Func<Post, bool>>>())).Returns(post);
session.Setup(s => s.CommitChanges());
};
Because of = …Run Code Online (Sandbox Code Playgroud) 最新的EF Code First NuGet包附带了一个IDatabaseInitializer被调用的自定义实现DontDropDbJustCreateTablesIfModelChanged.顾名思义,当检测到模型更改时,它不会丢弃并重新创建整个数据库,只需删除并重新创建表.
说我有这个模型类:
public class User
{
public string Username { get; set; }
// This property is new; the model has changed!
public string OpenID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个如何去实现一个IDatabaseInitializer是不降大任于表无论是.在这种情况下,它只会OpenID向User表添加一列?
鉴于此类:
public class Article
{
public string Name { get; set; }
public string Colour { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设我有以下内容List<Article>,其中一些文章包含逗号分隔的名称:
var list = new List<Article>
{
new Article { Name = "Article1, Article2, Article3", Colour = "Red" },
new Article { Name = "Article4, Article5, Article6", Colour = "Blue" },
}
Run Code Online (Sandbox Code Playgroud)
在一个Linq声明中,有没有办法获得一个列表,其中每个逗号分隔的名称成为一个单独的文章?
var list = new List<Article>
{
new Article { Name = "Article1", Colour = "Red" },
new Article { Name = "Article2", Colour …Run Code Online (Sandbox Code Playgroud) 我知道ASP.NET MVC 3不支持区域重用,这对于Web应用程序的用户管理区域非常方便,但部分视图怎么样呢?
假设我将Pager"控制"视为Razor(或者WebFormViewEngine,无关紧要)部分视图,我可以在我的MVC应用程序中轻松重用.
是否可以在多个MVC应用程序中重用它,而不是在新应用程序中创建局部视图并复制粘贴代码?
code-reuse partial-views razor webforms-view-engine asp.net-mvc-3
我有一个网站,用户可以发布和投票建议.在页面上,我最初列出了10个建议,标题每7秒获取一个新的随机建议.
我希望投票能够影响建议出现的概率,包括10个建议列表和标题建议.为此,我有一个小算法来计算人气,考虑到投票,年龄和其他一些事情(需要大量的调整).
无论如何,在运行算法后,我有一个建议和流行度指数字典,按人气排序:
{ S = Suggestion1, P = 0.86 }
{ S = Suggestion2, P = 0.643 }
{ S = Suggestion3, P = 0.134 }
{ S = Suggestion4, P = 0.07 }
{ S = Suggestion5, P = 0.0 }
{ . . .}
Run Code Online (Sandbox Code Playgroud)
我不希望这是一个美化的类型,所以我想在选择过程中引入一些随机元素.
简而言之,我希望受欢迎程度是从列表中挑选出一个建议的概率.
有完整的建议/受欢迎列表,我如何根据概率选择10?如何将相同的内容应用于循环标头建议?
c# ×5
asp.net-mvc ×2
.net ×1
.net-3.5 ×1
algorithm ×1
bdd ×1
c#-3.0 ×1
code-reuse ×1
jquery ×1
linq ×1
mspec ×1
probability ×1
razor ×1
watin ×1