c# – 更新,使用Moq删除单元测试的方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 更新,使用Moq删除单元测试的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5133字,纯文字阅读大概需要8分钟。
内容图文
![c# – 更新,使用Moq删除单元测试的方法](/upload/InfoBanner/zyjiaocheng/794/8503512d86f3450bb6da44c828d7550f.jpg)
我在单元测试中使用Moq框架.
这是UpdateApplication测试方法:
[TestMethod]
public void UpdateApplication()
{
const string newAplpicationName = "NewApplication1";
var data =
new[]
{
new Application { Id = 1, Name = "Application1" }, new Application { Id = 2, Name = "Application2" },
new Application { Id = 3, Name = "Application3" }, new Application { Id = 4, Name = "Application4" }
}
.AsQueryable();
var mockSet = new Mock<DbSet<Application>>();
mockSet.As<IQueryable<Application>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Application>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Application>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Application>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
mockSet.Setup(m => m.AddOrUpdate(It.IsAny<Application[]>())).Callback(
(Application[] apps) =>
{
apps.FirstOrDefault(m => m.Id == 1).Name = newAplpicationName;
}).Verifiable(); // <-- Exception
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(c => c.Applications).Returns(mockSet.Object);
// Act
var commandHandler = new UpdateApplicationCommandHandler(mockContext.Object);
var commandArg = new ApplicationCommandArg { Id = 1, Name = newAplpicationName };
commandHandler.Execute(new UpdateApplicationCommand(commandArg));
// Verify
mockContext.Verify(m => m.SaveChanges(), Times.Once());
}
运行测试时遇到异常:
An exception of type 'System.NotSupportedException' occurred in Moq.dll but was not handled in user code Additional information: Expression references a method that does not belong to the mocked object: m => m.AddOrUpdate(It.IsAny()) at Moq.Mock.ThrowIfNotMember(Expression setup, MethodInfo method) at Moq.Mock.c__DisplayClass19`1.b__18() at Moq.PexProtector.Invoke[T](Func`1 function) at Moq.Mock.Setup[T](Mock`1 mock, Expression`1 expression, Condition condition) at Moq.Mock`1.Setup(Expression`1 expression) at UpdateApplication() in UpdateApplicationCommandTests.cs:line 39
如何使用Moq编写更新和删除操作的单元测试?
解决方法:
UpdateApplication单元测试方法的这种变体对我有用,但我不确定它是否正确:
[TestMethod]
public void UpdateApplication()
{
const string newAplpicationName = "NewApplication1";
var data =
new[]
{
new Application { Id = 1, Name = "Application1" }, new Application { Id = 2, Name = "Application2" },
new Application { Id = 3, Name = "Application3" }, new Application { Id = 4, Name = "Application4" }
}
.AsQueryable();
var mockSet = new Mock<DbSet<Application>>();
mockSet.As<IQueryable<Application>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Application>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Application>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Application>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(m => m.Applications).Returns(mockSet.Object);
// Act
var commandHandler = new UpdateApplicationCommandHandler(mockContext.Object);
var commandArg = new ApplicationCommandArg { Id = 1, Name = newAplpicationName };
commandHandler.Execute(new UpdateApplicationCommand(commandArg));
Assert.AreEqual(newAplpicationName, data.First(m => m.Id == 1).Name);
mockContext.Verify(m => m.SaveChanges(), Times.Once());
}
但是我的DeleteApplicationCommandTest仍然存在问题.
当我运行测试时,我获得了一个“在模拟上的预期调用正好3次,但是是2次:m => m.Applications”.
这是测试方法:
[TestMethod]
public void DeleteApplication()
{
var data =
new[]
{
new Application { Id = 1, Name = "Application1" }, new Application { Id = 2, Name = "Application2" },
new Application { Id = 3, Name = "Application3" }, new Application { Id = 4, Name = "Application4" }
}
.AsQueryable();
var mockSet = new Mock<DbSet<Application>>();
mockSet.As<IQueryable<Application>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Application>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Application>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Application>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<AppDbContext>();
mockContext.Setup(m => m.Applications).Returns(mockSet.Object);
// Act
var commandHandler = new DeleteApplicationCommandHandler(mockContext.Object);
var commandArg = new ApplicationCommandArg { Id = 1 };
commandHandler.Execute(new DeleteApplicationCommand(commandArg));
// Verify
mockSet.Verify(m => m.Remove(It.IsAny<Application>()), Times.Once());
mockContext.Verify(m => m.SaveChanges(), Times.Once());
mockContext.VerifyGet(m => m.Applications, Times.Exactly(3));
}
这是我的DeleteApplicationCommandHandler的Execute方法:
public override void Execute(DeleteApplicationCommand command)
{
Debug.WriteLine("DeleteApplicationCommand executed");
var application = this.DbContext.Applications.FirstOrDefault(m => m.Id == command.CommandArg.Id);
if (application == null)
{
throw new Exception(string.Format("Application with id {0} was not found", command.CommandArg.Id));
}
this.DbContext.Applications.Remove(application);
this.DbContext.SaveChanges();
}
为什么DeleteApplication测试方法失败?
内容总结
以上是互联网集市为您收集整理的c# – 更新,使用Moq删除单元测试的方法全部内容,希望文章能够帮你解决c# – 更新,使用Moq删除单元测试的方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。