Strange behaviour with Local Accessfile as DB with relativ path

If you are using an Access-File as DB.
And specify it as relative path in your app.config file like this

<add name="MSAccess" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=..\..\AccessFile\LocalAccess.mdb;
User Id=admin;Password=;" providerName="System.Data.OleDb" />
If you are using OpenFileDialog or SaveFileDialog

openFileDialog1.DefaultExt = "pdf";
openFileDialog1.Filter = "Technical paper (*.pdf)|*.pdf";
openFileDialog1.FileName = "";
openFileDialog1.InitialDirectory = lastOpenedPath;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
   // do something
}
Bad Example - No RestoreDirectory, your access-file will not be found after FileDialog...


openFileDialog1.DefaultExt = "pdf";
openFileDialog1.Filter = "Technical paper (*.pdf)|*.pdf";
openFileDialog1.FileName = "";
//HACK PGfader: necessary so that the relative access file is found after this!
openFileDialog1.RestoreDirectory = true;
openFileDialog1.InitialDirectory = lastOpenedPath;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // do something
}
Good Example - RestoreDirectory used, local relative access file after ShowDialog


RestoreDirectory = false is default necessary to set on OpenFileDialog AND SaveFileDialog

Data driven unit tests with Filenames from a directory!


How to create simple data-driven-unit-tests with files from directories

Create the following folders in your solution
\files\valid\
\files\invalid\


copy in those folders your single files to test.
e.g. copy your valid testfiles (that are valid items for a test) to \files\valid\
and yout invalid testfiles to \files\invalid\




Problem

there is no dataprovider (DataSource) for directories (not in vs2005, in vs2008 im not sure)
create in each folder a text file.
\files\valid\data.txt
\files\invalid\data.txt

these text files will contain a directory listing with the single files!

add to your unit test

[DeploymentItem(@"files\invalid\data.txt", @"invalid")]
[DataSource("System.Data.OleDb", @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\files\invalid;Extended Properties='text;FMT=Delimited'", @"data.txt", DataAccessMethod.Sequential)]

now you will get in your unit test the single files
string fileName = TestContext.DataRow[0].ToString();



but how to fill the files data.txt?
use this method in Assembly Initialization

       [AssemblyInitialize]
       public static void CreateOutputDataTxtFiles(TestContext context)
       {
          
           string startDir = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(context.TestDir)), @"Siag.XXX.BusinessLogic.Test");
           string addDir = @"files\valid";

           WriteFilePathsToData(Path.Combine(startDir, addDir), "*.dat");

           addDir = @"files\invalid";

           WriteFilePathsToData(Path.Combine(startDir, addDir), "*.dat");

       }


       private static void WriteFilePathsToData(string startDir, string searchPattern)
       {
           StringBuilder result = new StringBuilder();

           foreach (string fileName in Directory.GetFiles(startDir, searchPattern))
           {
               result.AppendLine(fileName);
           }

           // add additional directories here

           string fileNameData = Path.Combine(startDir, @"data.txt");

           File.SetAttributes(fileNameData, FileAttributes.Normal);
           File.WriteAllText(fileNameData, result.ToString());
       }

Latest Posts

Popular Posts