我有一个现有的MVC5网络应用程序。我刚刚创建了一个新的单元测试项目并添加了以下代码....
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SomethingApp.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SUT = SomethingApp.Services.ReportingServices; // SUT = System Under Test
namespace SomethingApp.Services.Tests
{
[TestClass]
public class GettingScoreForQuestionShould
{
[TestMethod]
public void ReturnScoreWhenGivenValidData()
{
// Arrange
int eventId = 39;
int questionId = 271;
decimal score;
// Act
score = SUT.GetScoreForQuestion(eventId, questionId);
// Assert
Assert.AreEqual("80",score);
}
}
}
当GetScoreForQuestion方法在普通网络应用程序中运行时,它运行完美。但是,当我通过测试方法运行它时,我得到了这个错误...
消息:测试方法SomethingApp.Services.Tests.GettingScoreForQuestionShould.ReturnScoreWhenGivenValidData 抛出异常:System.InvalidOperationException:没有连接字符串 命名为'myDbContext'可以在应用程序配置文件中找到。
错误当然来自GetScoreForQuestion方法,该方法在普通网络应用程序中运行良好。
我不明白为什么我需要将一个应用程序配置文件和此配置连接字符串添加到测试项目中。似乎,因为我在MVC项目中调用该方法,它有责任建立连接并执行它(它在应用程序的正常过程中执行的操作) 。我错了什么?
并且,我尝试将新的application.config文件和连接字符串添加到单元测试项目中,但之后测试方法在构建后不再显示在测试资源管理器中。有什么建议?谢谢!
更新****
这里是GetScoreForQuestion的代码(有问题的方法,在网络应用程序中可以正常工作,但在通过测试方法调用时却不行)....
public static decimal GetScoreForQuestion(int eventId, int ThingyQuestionId)
{
// the following line fails with the connection issue
var ThingyResults = Db.ThingyResults.Where(e => e.EventId == eventId && e.ThingyQuestionId == ThingyQuestionId)
.AsNoTracking().ToList();
:
:
:
}
Db在与...相同的类中声明。
public static class ReportingServices
{
private static readonly ThingyContext Db = new ThingyContext();
答案 0 :(得分:2)
执行unittest时, 项目是正在运行的应用程序。这就是从中读取配置文件的位置。请注意,您需要app.config,而不是web.config。
答案 1 :(得分:0)
看起来您可能正在ReportingServices类中创建新的ThingyContext。查看注入接口,以便您可以将模拟实现替换为测试目的。
这里有一些帮助您入门的链接:
https://romiller.com/2012/02/14/testing-with-a-fake-dbcontext/