我试图使用EF7 InMemory提供程序进行单元测试,但测试之间的InMemory数据库的持久性使我遇到问题.
以下代码演示了我的问题.一个测试将起作用,另一个测试将始终失败.即使我在测试之间将_context设置为null,第二次测试运行总会有4条记录.
[TestClass]
public class UnitTest1
{
private SchoolContext _context;
[TestInitialize]
public void Setup()
{
Random rng = new Random();
var optionsBuilder = new DbContextOptionsBuilder<SchoolContext>();
optionsBuilder.UseInMemoryDatabase();
_context = new SchoolContext(optionsBuilder.Options);
_context.Students.AddRange(
new Student { Id = rng.Next(1,10000), Name = "Able" },
new Student { Id = rng.Next(1,10000), Name = "Bob" }
);
_context.SaveChanges();
}
[TestCleanup]
public void Cleanup()
{
_context = null;
}
[TestMethod]
public void TestMethod1()
{
Assert.AreEqual(2, _context.Students.ToList().Count());
}
[TestMethod]
public void TestMethod2()
{
Assert.AreEqual(2, _context.Students.ToList().Count());
} …
Run Code Online (Sandbox Code Playgroud) 我有一个带有UserControl的页面.如果用户在我想要处理的页面上的任何位置按Esc.
我认为这就像挂钩PreviewKeyDown事件,测试Esc键,然后处理它一样简单.但是,当我在事件处理程序中放置断点时,我发现它永远不会被调用.我想也许UserControl可能会被击中,所以我尝试了PreviewKeyDown ......结果相同.
有没有人知道在Page对象上测试KeyDown或PreviewKeyDown的正确位置?
现在我的ajax发布所有激活他们的错误事件,即使该操作没有导致错误.我有一个ASP.NET MVC操作,看起来像:
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult StuffToDo(int id)
{
// do various things that work ...
return new JsonResult(); // i have to return something, so this...
}
Run Code Online (Sandbox Code Playgroud)
在客户端我有这个jQuery:
$('#actionClick').click(function() {
if (confirm('Are you sure?')) {
$.ajax({
type: "POST",
url: "/Customer/StuffToDo/<%= Model.Customer.Id %>",
contentType: "application/json; charset=utf-8",
data: "{}",
dataType: "json",
success: function() {
ShowSuccessResult("Yay!");
},
error: function(xhr, ajaxOptions, thrownError) {
ShowErrorResult("Boo! Message:" + xhr.responseText);
}
});
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
如果操作成功(没有抛出异常),那么我希望触发成功事件处理程序.相反,错误事件正在触发.有什么东西我应该传回或改变动作,以便成功事件触发?
我意识到这个问题与其他问题基本相同,但我的错误处理程序已经有了扩展的签名,解决了其他人的问题.
编辑 每个请求,这是我得到的响应:
链接到屏幕截图 (不知道如何显示它有问题)
编辑 我将返回值更改为Null以查看是否影响了任何内容,但没有更改行为. …
我有一个由Linq查询填充的数据网格.当datagrid中的焦点行发生更改时,我需要设置一个等于该对象中某个属性的变量.
我试过了...
var selectedObject = view.GetRow(rowHandle);
_selectedId = selectedObject.Id;
Run Code Online (Sandbox Code Playgroud)
...但编译器根本不关心这个("嵌入式语句不能是声明或标注语句").
看起来这个属性应该很容易访问.在运行时检查对象会显示我期望的所有属性,我只是不知道如何访问它们.
如何访问匿名对象的属性?
编辑澄清:
我碰巧使用DevExpress XtraGrid控件.我用Linq查询加载了这个控件,该查询由几个不同的对象组成,因此使得数据不符合我已经拥有的任何一个类(即,我无法将其转换为任何类).
我正在使用.NET 3.5.
当我查看view.GetRow(rowHandle)方法的结果时,我得到一个如下所示的匿名类型:
{ ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }
Run Code Online (Sandbox Code Playgroud)
我的目标是从这个匿名类型获取ClientId,以便我可以做其他事情(例如在其中加载具有该客户端记录的表单).
我在早期的答案中尝试了一些建议,但无法达到我可以获得此ClientId的程度.
我有一个场景,我有一个时区偏移(以分钟为单位),需要确定它的时区.我知道所有数据都不可用(例如,可能有几个时区的偏移量为-240分钟),但"最佳猜测"是可以接受的.
我的第一次传球看起来像这样:
foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
if (info.BaseUtcOffset.TotalMinutes == timezoneOffset)
{
// do something here if this is a valid timezone
}
}
Run Code Online (Sandbox Code Playgroud)
这种方式有效,但我需要考虑夏令时,这有点让我失望.我添加了这个可怕的黑客:
foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0;
if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset)
{
// do something here if this is a valid timezone
}
}
Run Code Online (Sandbox Code Playgroud)
这样做"足够好",因为当夏令时没有生效时,我可以向用户显示正确的时间,并且在夏令时期间大约70%是正确的.仍然......这对我的眼球来说是一些可怕的代码.
有一个更好的方法吗?更优雅会更好,更准确更好.
更新
从技术上讲,我可以访问Javascript可以获得的有关日期的任何信息.我有一个页面,我在其中放置了一个名为"offset"的隐藏字段.我有一个JQuery函数,用DateTime().getTimezoneOffset()填充偏移字段.虽然我没有在DateTime对象上看到任何有用的东西,但也许这会打开其他想法的途径.
我有一个简单的PostSharp日志记录属性:
[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
private ILog _logger;
public override void OnEntry(MethodExecutionEventArgs eventArgs)
{
_logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());
_logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过向日志条目添加有关方法参数的信息来使此属性更加灵活,但仅在需要时才这样做.
[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
private ILog _logger;
public override void OnEntry(MethodExecutionEventArgs eventArgs)
{
_logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());
// if ShowParameters = true
_logger.DebugFormat("Entered {0} with args:{1}", eventArgs.Method.Name, args);
// else
_logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
// endif
}
}
Run Code Online (Sandbox Code Playgroud)
带有IF的伪代码是我不知道该怎么做的.如何将其传递给属性?我希望它看起来像这样,但我不知道如何在属性代码中处理它:
[MethodLogging(ShowParameters=true)]
public void SomeCrazyMethod(int CustomerId, string SecretName) {...}
Run Code Online (Sandbox Code Playgroud) 我有一些问题,我猜这些问题与使用.NET Core Web API和Entity Framework Core进行自引用有关.我添加时,我的Web API开始窒息.包括一些导航属性.
我发现旧的Web API中似乎是一个解决方案,但我不知道如何为.NET Core Web API实现相同的功能(我还处于早期学习阶段).
较旧的解决方案是将其粘贴在Global.asax的Application_Start()中:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
Run Code Online (Sandbox Code Playgroud)
我怀疑这是在StartUp的ConfigureService()方法中处理的,但除此之外我不太了解.
或者有更合适的方法来处理这个问题吗?
我有一个字符串,里面有几个html注释.我需要计算表达式的唯一匹配.
例如,字符串可能是:
var teststring = "<!--X1-->Hi<!--X1-->there<!--X2-->";
Run Code Online (Sandbox Code Playgroud)
我目前用这个来获得比赛:
var regex = new Regex("<!--X.-->");
var matches = regex.Matches(teststring);
Run Code Online (Sandbox Code Playgroud)
结果是3场比赛.但是,我想这只有两场比赛,因为只有两场比赛.
我知道我可以循环生成MatchCollection并删除额外的Match,但我希望有一个更优雅的解决方案.
澄清:样本字符串与实际使用的内容大大简化.很容易就有X8或X9,字符串中可能有几十个.
我有一个简单的控制器返回图像:
public class ImageController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
[OutputCache(CacheProfile = "StationeryImageCache")]
public FileResult Show(int customerId, string imageName)
{
try
{
var path = string.Concat(Config.ImageDir, customerId, @"\", imageName);
return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg");
}
catch(System.IO.FileNotFoundException ex)
{
throw new MissingImageException(imageName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的经理在代码审查期间发现了FileStreamResult,并提到我应该将其与以下内容交换:
return new FilePathResult(path, "image/jpeg");
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,所以我做到了.但是几天之后,我们其他开发人员报告说我返回的一些图像已经损坏了.具体来说,有很多图像在某些时候被切断了.图像的大小是正确的,但底部25% - 40%的图像只是消失了.
在查看文件系统上的原始图像时,它没有任何问题.我在浏览器中填充图像,看起来很好.但是我的控制器只返回了部分图像.更糟糕的是,只有一些图像是问题......大约有30%......虽然我找不到任何有用的图像和有效图像之间的差异.
在尝试调试时,我将操作的结果恢复为FileStreamResult,突然一切都恢复了.
有谁知道对此的解释?
我有一些看起来像这样的jQuery:
$.ajax({
type: "POST",
url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
contentType: "application/json",
success: refreshTransactions,
error: function(xhr, ajaxOptions, thrownError) {
alert("Failed to cancel subscription! Message:" + xhr.statusText);
}
});
Run Code Online (Sandbox Code Playgroud)
如果被调用的动作导致异常,它最终将被Global.asax Application_Error拾取,其中我有一些代码如下:
var ex = Server.GetLastError();
if (Request.ContentType.Contains("application/json"))
{
Response.StatusCode = 500;
Response.StatusDescription = ex.Message;
Response.TrySkipIisCustomErrors = true;
}
else
{
// some other way of handling errors ...
}
Run Code Online (Sandbox Code Playgroud)
当我执行发布帖子的脚本时,Request.ContentType始终是一个空字符串,因此不会遇到第一个if块.我应该在ajax"contentType"中添加一些其他值吗?或者我有另一种方式告诉asp.net内容类型应该是"application/json"吗?
澄清
我试图实现的目标是将异常消息传递回ajax错误事件.目前,即使绕过IF块,错误事件也会正确抛出警告框,但消息为"未找到".
正如您所看到的,我正在尝试将exeception消息设置为Response.StatusDescription,我相信ajax错误中的xhr.statusText设置为.
c# ×5
asp.net-mvc ×3
jquery ×2
.net ×1
actionresult ×1
ajax ×1
javascript ×1
keydown ×1
mstest ×1
postsharp ×1
regex ×1
timezone ×1
unit-testing ×1
utc ×1
wpf ×1