在一位同事提供的有用链接之后,我最终使用Process.Start
来运行sqlpackage.exe
部署。从 Visual Studio 的角度来看,它不像我希望的那样干净,但它完成了工作。我的引导现在看起来像这样:
private const string SQL_PUBLISH_COMMAND = @"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe";
private const string SQL_PUBLISH_COMMAND_ARGUMENTS = @"/Action:Publish /SourceFile:C:\Data\Code\NewEdCo\Domain\NewEdCo.Database.SQLExpress\bin\Debug\NewEdCo.Database.SQLExpress.dacpac /Properties:CreateNewDatabase=True /TargetServerName:hactar\sqlexpress2012 /TargetDatabaseName:NewEdCoTest";
private void DeployTestDatabase()
{
var procInfo = new ProcessStartInfo
{
Arguments = SQL_PUBLISH_COMMAND_ARGUMENTS,
CreateNoWindow = true,
ErrorDialog = false,
FileName = SQL_PUBLISH_COMMAND,
RedirectStandardOutput = true,
UseShellExecute = false
};
var proc = new Process
{
StartInfo = procInfo
};
proc.Start();
var result = proc.StandardOutput.ReadToEnd();
}
[TestInitialize]
public void BootstrapTests()
{
DeployTestDatabase();
}
[TestCleanup]
public void TearDownTests()
{
DeployTestDatabase();
}
用于ProcessStartInfo
标准输出和读取的选项(即使我还没有对它做任何事情)是为了保持任务同步。这样测试就不会互相影响。这增加了集成测试的执行时间,但这对我的需求来说很好。
我意识到我在前后都进行了彻底的刷新。如果随着我的测试数量增加而这需要太长时间,我会重新考虑。但是现在我想确保它在测试前被刷新,并且在测试后不留下任何痕迹。
MSDN 提供了广泛的sqlpackage.exe
.