|
Unless the files are quite small, I find mocking the file access to be extremely tedious. What you need is to add the XML files into your test project and have them copied into the bin directory (Right click the XML file in the project and click properties. One of the properties gives you an option to Copy Always to the build/output directory).
You also need one XML file per test so that there is no need for other developers to be changing the files unless they are updating the test. Sometimes you may find that a groups of tests will need to work on the same file. That is fine if you make that clear.
|
|
|
|
|
Thanks colin - I read your this[^] article which talks about the same subject. Under "The real object is difficult to set up" section, you are talking about the database part and it's problems when a test database is used. I also have a similar scenario. In that case how do I mock the object ?
Let me clear it - I need to ensure that, my code is inserting values to a table and it's related values to other table. So how do I use mock objects here ? Just a clue will help me to get started.
|
|
|
|
|
N a v a n e e t h wrote: I need to ensure that, my code is inserting values to a table and it's related values to other table. So how do I use mock objects here ? Just a clue will help me to get started.
Okay - If the application is properly layered your business code will know nothing about the database. Therefore when you are testing your business code you mock the DAL classes (which are acting as the buffer between your application and the database). There will be no database interaction going on, and no need to mock the database itself because your mock objects will be returning the values to the business layer.
If you are testing the DAL layer itself then you may want to mock the database out. However, the way I usually create the DAL layer is that it acts as a proxy to the stored procedures in the database. In this case I don't mock anything out because what I'm really doing is testing the database and the easiest way to do that is through the DAL.
If your DAL is more complex then you may want to mock out the database calls.
However, from what you are saying "I need to ensure that my code is inserting values to a table and it's related values to other table" then what you doing is testing the database itself. Remember you cannot mock the thing you are testing because if you do the test will be flawed as the test will only be testing the mock object.
So, if you are testing the database, its stored procedures and triggers then you are going to have to have your tests create test data in the database for the tests to use. These are more time consuming tests as you will have to reset the database between tests so that it is in a consistent state. I've found that restoring known backups (small backups) to be fairly efficient without getting bogged down in too much T-SQL.
I hope that helps.
|
|
|
|
|
Colin Angus Mackay wrote: ). There will be no database interaction going on, and no need to mock the database itself because your mock objects will be returning the values to the business layer.
Well, my application is perfectly layered (I think). Business layer don't know anything about database and my DAL returns a IDataReader instance to business layer. So I should write a mock object which returns IDataReader instance for testing business layer right ?
Colin Angus Mackay wrote: I hope that helps.
Sure, it helped. Thanks for the reply.
|
|
|
|
|
N a v a n e e t h wrote: Business layer don't know anything about database and my DAL returns a IDataReader
Ah... So it knows it is a database. To me a DAL (Data Abstraction Layer) does exactly that. It abstracts out ANY form of data whether that is a database, XML file, plain text file, web service or whatever.
N a v a n e e t h wrote: So I should write a mock object which returns IDataReader instance for testing business layer right ?
You can do. However, I've found that mocking things like data readers, stream readers/writers and the like get into quite a bit of problems because of the complexity of the object and the way it interacts with the code you are testing.
I only return IDataReaders in simple cases. I normally try and create some sort of DTO (Data Transfer Object) which is a simple class with just a bunch of properties (very easily mocked). One DTO per row. If the DTO is immutable then better still because then you don't have to mock DTOs you can create real ones (there is generally nothing to be mocked in an immutable object because it cannot change once created).
|
|
|
|
|
Colin Angus Mackay wrote: Ah... So it knows it is a database
Colin Angus Mackay wrote: I normally try and create some sort of DTO (Data Transfer Object) which is a simple class with just a bunch of properties (very easily mocked).
This is what I need to do
1 - Select details from a table say "Product".
2 - Generate a "Product" class instance with the values. This will be done by a product factory class.
My initial design was returning IDataReader instance from DAL and supplying that to product factory. Product factory class will read the values and create a "Product" instance. After seeing your comment on DTO, I redesigned it like the following
1 - A product DAL which gets value from DB
2 - This DAL fills a class called "ProductDTO" with necessary properties. This product DTO implements IProduct interface. Finally DAL returns IProduct instance to the business layer.
3 - Product factory takes IProduct instance and creates final Product class.
This works pretty well and I can mock IProduct easily. Is this approach correct ?
In this approach, I see an extra step included than returning IDataReader , which is creating the DTO. So in a performance perceptive, will this be an overhead ? Also you told business layer shouldn't know anything about the underlying datastore - but if I am sure that there won't be any data store other than database, will avoiding DTOs makes sense (I know it's tough to mock) ?
Thanks again for the reply
|
|
|
|
|
N a v a n e e t h wrote: This works pretty well and I can mock IProduct easily. Is this approach correct ?
Okay - but if ProductDTO is immutable. In other words everything is created in the constructor and all the properties are getters and there are no other methods that modified the contents of the class, then you don't need to mock the DTO as there is no functionality to mock. If you are planning to use the DTO to update the database and have the business layer modify it and send it back to the DAL then obviously it cannot be immutable.
N a v a n e e t h wrote: So in a performance perceptive, will this be an overhead ?
Yes, but generally it is negligible. It is certainly much smaller than with a DataSet.
If you are sure that you will only ever connect to a database then I suppose you could dispense with the DTOs and have the factory class create the business object directly from the IDataReader. In fact, that is something I used to do and it can be quite effective. The factory class is acting as a buffer between the DAL and the Business Layer when you are retrieving data from the database. Out of necessity it knows a little about both layers.
|
|
|
|
|
Colin - Thanks for that. It's much appreciated. I am almost clear with the mocking and DTOs. I will give it a try. BTW, do you have any sample DTO class ?
|
|
|
|
|
I have written the following DTO.
class Product
{
internal Product(ProductItem item)
{
this.Name = item.Name;
}
public string Name
{
get;set;
}
public static Product FromId(int productId)
{
ProductDAL data = new ProductDAL();
ProductItem item = data.GetProductFromId(productId);
return ProductFactory.CreateProduct(item);
}
public void Save()
{
ProductDAL data = new ProductDAL();
ProductItem item = new ProductItem(this.Name);
data.SaveDetails(item);
}
}
static class ProductFactory
{
public static CreateProduct(ProductItem item)
{
Product product = new Product(item);
return product;
}
}
class ProductItem
{
public ProductItem(string name)
{
this.Name = name;
}
public string Name
{
get;set;
}
} Here ProductItem is the DTO class and it contains only getters and setters. This is mutable. Is this correct ? Do you used to write methods in the DTO class ?
Thanks for the replies.
|
|
|
|
|
is it possible to format the number 150000 to 1,50,000. I tried formatting using DataformatString but, it displays 150,000.
Do anyone know how to format a number to indian currency.
N.Surendra Prasad
|
|
|
|
|
U need to count number of digits and place the , accordingly
There may be other alternatives .. for a quick fix try the above
If You win You need not Explain............
But If You Loose You Should not be there to Explain......
|
|
|
|
|
This[^] is in VB but may help.
Dave
|
|
|
|
|
Do you have any sample on how to use this?
|
|
|
|
|
The full thread is here[^] - there's an explaination of the code at the bottom by the author.
Dave
|
|
|
|
|
Having looked in more detail I think that thread is a little over-complicated.
Why not use the CultureInfo class? If you're going to be using it alot it could be useful to set it as an extension method something like this.
using System.Globalization;
namespace Indian
{
public static class ExtMethods
{
public static string ToIndian(this double amount, bool includePrefix)
{
CultureInfo indianCulture = new CultureInfo("hi-IN");
string indianString = amount.ToString("C", indianCulture);
if (includePrefix)
{
return indianString;
}
return indianString.Substring(2);
}
}
}
then add using Indian; to the beginning of any class that needs it.
You can then easily call the method on any double value (change it to other value type if required!).
double doubleIndian = 1234567.89;
string stringIndian = doubleIndian.ToIndian(false);
Dave
|
|
|
|
|
I'm just starting out learning C# and am having trouble sending a message between a client and server over a UDP connection. I'm thinking it's my code, maybe the server side because when I load the server my GUI does not show unless I take out the line "recv = server.ReceiveFrom(data, ref remote);". I'm using Visual Studios 2005 and any help is appreciated. If you have any advice or tutorials that could help me get a better grasp on working with C# in general, it would also be appreciated. Thanks!
Server:
Socket server;
public Message_Server()
{
InitializeComponent();
int recv;
String receiveData;
server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote = (EndPoint)remoteEP;
Byte[] data = new Byte[1024];
server.Bind(remote);
//while (true)
//{
recv = server.ReceiveFrom(data, ref remote);
//data = server.Receive(ref remoteEP);
receiveData = Encoding.ASCII.GetString(data, 0, recv);
//receiveData = Encoding.ASCII.GetString(data, 0, data.Length;
displayBox.Text = receiveData;
//}
}
Client:
private String IPAddr = "192.168.1.101";
private int portNum = 7000;
private bool err = true;
Network_Input NI = new Network_Input();
Socket client;
public Message_Client()
{
InitializeComponent();
}
private void sendBtn_Click(object sender, EventArgs e)
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(IPAddr), portNum);
try
{
String message = "Hello World";
byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
client.SendTo(data, data.Length, SocketFlags.None, remoteEP);
}
catch (SocketException)
{
MessageBox.Show("Socket Exception");
}
}
Thanks Again!
|
|
|
|
|
Where do you define the sending port in the server part?
|
|
|
|
|
Hi all,
How can i update exe file after i install the application in user PC? For vb application, i can just replace the existing exe file with the updating exe file in program directory.But how can i do it in C#?
any tips are welcome.
Thanks in advance
cocoonwls
|
|
|
|
|
Once your app has detected that a new version is available, you could exit your app and run a companion updater program that performs the download and overwrite (and optionally restarts your app).
/ravi
|
|
|
|
|
Ravi Bhavnani wrote: run a companion updater program
Hi ravi, can you please tell me more details how to execute it in my program?Thanks
|
|
|
|
|
See this[^] CP article.
Sorry, that's a C++ article.
Basically the updater needs to restart your app after successfully updating it by downloading the new bits. Use Process.Start() [^] to restart the app.
/ravi
|
|
|
|
|
Can anyone please tell me how to catch an cell change event due to formula, for example if at cell A3 has got formula =A1+A2, now if the value of A1 has changed then it reflects the value A3 too, but I am not able to get the cell change event on that.
I have got following KB article for that, it catches cell change event but not catch if a value of cell is changed due to a formula.
http://support.microsoft.com/kb/823981[^]
Thanks,
Mushq
|
|
|
|
|
Hi there,
I am trying to find information about the file metadata in Windows. Every file
has a summary tab page in its general properties. Where is that information stored?
I want to access and modify this data (the Keywords field in particular) from within C#.
I couldn't find anything useful online. Maybe some of you guys can enlighten me.
cheers from Germany...
|
|
|
|
|
Ok, before you read all the code I am Telling you this IS a homework assignment. My professor is not helping out very much with it (for me) and I just do not understand how to get this working. I would like to not have the code handed to me but would like some good advise on how to complete this.
namespace IT274_U2
{
public interface IAnimal
{
string WhatAmI { get; }
string WhatIsMyName { get; }
}
abstract class Animal : IAnimal
{
private string _WhatAmI;
private string _WhatIsMyName;
public string WhatAmI
{
get
{
return _WhatAmI;
}
}
public string WhatIsMyName
{
get
{
return _WhatIsMyName;
}
}
}
class Dog : Animal
{
}
class Cat : Animal
{
}
public class TesterClass
{
static void DescribeAnimal(IAnimal animal)
{
Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
}
static void Main(string[] args)
{
Dog mydog = new Dog("Dog", "Spot");
Cat mycat = new Cat("Cat", "Felix");
DescribeAnimal(mydog);
DescribeAnimal(mycat);
}
}
}
Ok I have the Interface IAnimal. Now I needed to make an abstract class Animal (required). Ok Now how do I implement new dog() and new Cat() if I cannot include another public void Dog(string _WhatAmI, _WhatIsMyName) ?? Because that has to be in there somewhere because it requires 2 arguments?!?!
I am way confused on this....
|
|
|
|
|
First off, in your Animal class you will need to change the _WhatAmI and _WhatIsMyName variables to protected. A protected variable is exactly the same as private except that derived classes can access the variable. If your not sure what I mean, then try to acces the variable _WhatAmI from the Dog or Cat classes and see what happens.
Now, when you call new ClassName it creates a new instance of the class and the classes constructor is automatically called. So, you need to create a constructor for your Dog and Cat classes which takes the two string parameters.
MSDN on access modifiers[^]
Lots of info on constructors[^]
My current favourite word is: I'm starting to run out of fav. words!
-SK Genius
Game Programming articles start - here[ ^]-
|
|
|
|