ทำ Unit Test สำหรับ SharePoint 2010
มีโครงการกับทีมงานที่ที่ทำงานว่าเราจะพัฒนาซอฟท์แวร์โดยนำแนวทาง Test Driven Development มาใช้ กล่าวง่าย ๆ คือการเขียน Test ก่อนการพัฒนา ซึ่งนั่นก็แน่นอนว่าเราต้องทำ Class กันเข้มข้นพอสมควร ขั้นตอนก่อนจะเริ่มกระบวนการนี้เราคงต้องมาทบทวนกันว่าใน Visual Studio 2010 นั้นมีกระบวนการใดบ้างที่จะทำ Unit Test กับโปรเจคที่ทำงานกับ SharePoint 2010
มาดูสภาวะแวดล้อมกันก่อน เครื่องที่ผมใช้จัดกระบวนการนี้เป็น Windows 7 (x64) Enterprise Edition SP1 ติดตั้ง SharePoint Foundation 2010 SP1 และ Visual Studio 2010 Ultimate SP1
สิ่งแรกที่ได้ทำคือ เราต้องทำการสร้าง Empty SharePoint Solution ขึ้นมา 1 อัน เพราะเราต้องการจะสร้าง Class Library ที่มีการอ้างอิงเกี่ยวกับไลบารี่ของ SharePoint ให้เรียบร้อย หลังจากนั้นก็ทำการสร้าง Test Project เพิ่มเข้าไปใน Solution เดิมของเรา
ขั้นนี้ปัญหาข้อแรกที่พบคือ SharePoint Project ของเราจะใช้งาน .NET Framework 3.5 แต่ Test Project ใช้งาน .NET Framework 4 ซึ่งไม่ง่ายเลยที่จะปรับให้ Framework ตรงกัน แต่เมื่อตามลิงค์ที่อยู่ตอนท้ายของหน้าต่างแจ้งปัญหานั้น (แหมจะทำให้มันกดลิงค์ง่าย ๆ หน่อยก็ไม่ได้นะ Microsoft) ดังนี้ Possible Additional Steps to Enable Re-targeting of Test Projects to .NET Framework 3.5 ซึ่งบอกให้ทำการแก้ไข devenv.exe.config
ซึ่งก็เหมือนจะผ่านไปได้ด้วยดี เราก็สามารถเปลี่ยน Test Project ให้มีเป้าหมายเป็น .NET Framework 3.5 ได้แล้ว
ขั้นตอนเหมือนจะผ่านไปได้ด้วยดี ผมก็เริ่มทำการสร้าง Code ทดสอบมีการเรียกใช้งาน SPSite
และ SPWeb
แล้วจึงทำการสร้าง TestInitialize เพื่อสร้างออปเจ็คของ SPSite และ SPWeb เพื่อผ่านค่าไปยัง Code ซึ่งก็ไม่ได้ทำอะไรผิดปกติ เมื่อทำการรันเทส ก็พบข้อผิดพลาดยอดนิยมที่คาดว่าจะได้เจอนั่นคือ
System.IO.FileNotFoundException: The Web application at {sharepointurl} could not be found. Verify that you have typed the URL correctly. If the URL should be serving existing content, the system administrator may need to add a new request URL mapping to the intended application.
สิ่งแรกที่ผมเดาคือ เพราะ Platform target ของ SharePoint Project ไม่ได้เป็น x64 ก็เลยลองเปลี่ยนจาก Any CPU เป็น x64 แต่แล้วก็พบกับ Error ตัวอื่นคือ
System.BadImageFormatException: Could not load file or assembly '{assemblyinfo}' or one of its dependencies. An attempt was made to load a program with an incorrect format.
ดูจะเลวร้ายไปกันใหญ่ครับ ปัญหานี้เกิดเพราะการพยายามโหลดไลบารี่ x64 จาก x86 ครับ นั่นเพราะตัวโหลดเทสยังคงทำงานเป็น x86 อยู่ ไม่ได้เป็น x64 แบบที่เราต้องการ ก็ลองค้นหาข้อมูลก็ได้พบข้อมูลจากบล็อกหนึ่งในทีมที่ทำตัว Test ใน Visual Studio ให้แนวทางไว้ว่า สามารถทำ Class คั่นกลางหลอกได้ โดย Class นี้จะไปเรียกไลบารี่ x64 อีกต่อหนึ่งไม่ให้ตัวเทสเรียกไลบารี่ x64 โดยตรง ซึ่งก็เหมือนจะใช้ได้นะ แต่หลังจากนั้นก็ไปค้น ๆ ในบล็อกของคนเดิม เจอสิ่งที่เด็ดกว่านั้นนั่นคือ Visual Studio Team Test Load Agent Goes 64 Bit! ซึ่งนั่นก็คือตัวรันเทสมันเป็น x64 อยู่แล้ว แต่เราต้องตั้งค่ามันให้เป็น โดยต้องไปปรับค่าของ Run tests in 32 bit or 64 bit process ซึ่งหลบอยู่ในหัวข้อ Hosts ใน Test Setting ให้เป็น Run tests in 64 bit process on 64 bit machine แล้วก็ไปทำการปรับค่า Platform target ของทั้ง Test Project และ SharePoint Project เป็น Any CPU
หลังจากนั้นทุก Error ที่เจอก็จะหายไป สามารถทำ Test ได้แล้ว แต่วิธีนี้ก็ยังมีข้อจำกัดคือ ไม่สามารถทำการทดสอบ private Method ได้ จะเจออาการ BadImageFormatException ซึ่งก็คาดเดาได้ว่าเกิดจากกระบวนการพิเศษที่ใช้ล้วงลูกนั่นเอง ก็หวังว่าจะมีการปรับปรุงแก้ไขกันต่อไปให้สามารถใช้งานได้